On 3/28/07, Abdulaziz Ghuloum <[EMAIL PROTECTED]> wrote:

On Mar 28, 2007, at 12:51 PM, Joe Marshall wrote:

> Since we're discussing the semantics of LETREC, I've always thought
> it was
> a wart in the language to specify LETREC in terms of SET!  It would
> be nice
> if implementations were permitted (but not required) to implement
> LETREC
> in terms of a fixed-point operator as an alternative to SET!

Do you mean that an implementation should be allowed to treat E1 as E2
or E3 instead of E4?

E1=
(letrec ((fact (lambda (n) (if (zero? n) 1 (fact (- n 1))))))
  (fact 5))

E2=
(fix ((fact (lambda (n) (if (zero? n) 1 (fact (- n 1))))))
  (fact 5))

E3=
(let ([fact (Y (lambda (fact)
                 (lambda (n) (if (zero? n) 1 (fact (- n 1))))))])
  (fact 5))

E4=
(let ((fact (unspecified)))
  (let ((t (lambda (n) (if (zero? n) 1 (fact (- n 1))))))
    (set! fact t))
  (fact 5))

Yes.


> One advantage of this is that it would be much easier to create a
> purely
> functional subset of Scheme.

How do you do the following functionally?

(letrec ([f (g (lambda () f))])
  f)

With a lot of rewriting so that f can take a thunked version of itself
as an argument.

--
~jrm

_______________________________________________
r6rs-discuss mailing list
[email protected]
http://lists.r6rs.org/cgi-bin/mailman/listinfo/r6rs-discuss

Reply via email to