
In article <1073668638.3ffee21e290c4@webmail.emba.uvm.edu>, dvanhorn@emba.uvm.edu wrote:
In this post to c.l.scheme, Dorai Sitaram writes:
letrec with set! is certainly different from letrec with Y, and you don't need call/cc to distinguish the two.
(define *keep-track* '())
(letrec ((fact (lambda (n) (set! *keep-track* (cons fact *keep-track*)) (if (= n 0) 1 (* n (fact (- n 1))))))) (fact 8))
and then do
(eq? (car *keep-track*) (cadr *keep-track*))
If letrec is set!-based (as in Scheme), the result is #t. If it is Y-based, the result is #f. Why this is should be obvious if you mentally (or with pencil) trace what Y does.
Does Haskell mfix count as Y? My implementation is mfix-based, and the above code returns 40320 #t. Try it yourself at http://hscheme.sourceforge.net/interpret.php if you don't believe me. I'd be very interested to know if my implementation of Scheme varies from R5RS due to this issue. -- Ashley Yakeley, Seattle WA