Please combine let* let letrec into super-let, (or simply let) for
future consideration.
I can not for my life see a reason for keeping "the other" "lets",
other than the super-let (or simply let). Is there occassions why one
would want "the other" "lets" other than super-let? If one word can
mean three features, why not use the super version for brevity. Just a
suggestion.
The semantics are not the same.
First for simple values:
> (let ((a 1) (b 2)) (let ((a 3) (b a)) (display (list a b)) (newline)))
(3 1)
> (let ((a 1) (b 2)) (let* ((a 3) (b a)) (display (list a b)) (newline)))
(3 3)
> (let ((a 1) (b 2)) (letrec ((a 3) (b a)) (display (list a b)) (newline)))
(3 3)
Next for functions:
> (let ((a (lambda (x) 1)) (b (lambda (x) 2)))
(let ((a (lambda (x) (if (< 0 x) (cons 3 (a (- x 1))) '(3))))
(b (lambda (x) (cons 4 (a x)))))
(display (list (a 1) (b 1))) (newline)))
((3 . 1) (4 . 1))
> (let ((a (lambda (x) 1)) (b (lambda (x) 2)))
(let* ((a (lambda (x) (if (< 0 x) (cons 3 (a (- x 1))) '(3))))
(b (lambda (x) (cons 4 (a x)))))
(display (list (a 1) (b 1))) (newline)))
((3 . 1) (4 3 . 1))
> (let ((a (lambda (x) 1)) (b (lambda (x) 2)))
(letrec ((a (lambda (x) (if (< 0 x) (cons 3 (a (- x 1))) '(3))))
(b (lambda (x) (cons 4 (a x)))))
(display (list (a 1) (b 1))) (newline)))
((3 3) (4 3 3))
So, depending on the kind of results you want, you will choose one or
the other.
--
__Pascal Bourguignon__ http://www.informatimago.com/
Pour moi, la grande question n'a jamais été: «Qui suis-je? Où vais-je?»
comme l'a formulé si adroitement notre ami Pascal, mais plutôt:
«Comment vais-je m'en tirer?» -- Jean Yanne
True, but I can imagine the OP thought about using the letrec semantics
for everything (at least that's what I'd suggest).
What's a real-world (not examples as above) benefit of having a simple
(let) that can not be achieved easily with (letrec)? Or is the main
benefit of (let) to allow better optimization as its semantics is simpler?
Yours,
Daniel
--
Done: Arc-Bar-Cav-Sam-Val-Wiz, Dwa-Elf-Gno-Hum-Orc, Law-Neu-Cha, Fem-Mal
To go: Hea-Kni-Mon-Pri-Ran-Rog-Tou
Would letrec* fill your needs? It's supported by a number of
implementations, and it's also in R6RS:
http://www.r6rs.org/final/html/r6rs/r6rs-Z-H-14.html#node_idx_406
Lauri
PLT Scheme has let+, which combines let, let*, letrec, letrec*, let-
values, let*-values letrec-values and letrec*-values.
See http://docs.plt-scheme.org/mzlib/mzlib_etc.html#(form._((lib._mzlib/etc..ss)._let+))
Jos
The use of the various kinds of let, as opposed to a single super-let,
can give the reader valuable clues about the nature of your program.
Letrec has different scoping rules than let. Using super-let would
confuse the reader about the intentions of the author.
I agree. It's good specialization and I believe that also leads to
more efficient implementations.