Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Combine let* let letrec into super-let (or simply let)

17 views
Skip to first unread message

naruto...@gmail.com

unread,
Aug 26, 2008, 1:19:18 PM8/26/08
to
hi

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.

Pascal J. Bourguignon

unread,
Aug 26, 2008, 2:02:13 PM8/26/08
to
"naruto...@gmail.com" <naruto...@gmail.com> writes:

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

Daniel Kraft

unread,
Aug 26, 2008, 2:10:52 PM8/26/08
to
Pascal J. Bourguignon wrote:
> "naruto...@gmail.com" <naruto...@gmail.com> writes:
>
>> hi
>>
>> 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)

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

Lauri Alanko

unread,
Aug 26, 2008, 2:42:41 PM8/26/08
to
In article <f22087d8-22b2-4dc6...@p31g2000prf.googlegroups.com>,

naruto...@gmail.com <naruto...@gmail.com> wrote:
> Please combine let* let letrec into super-let, (or simply let) for
> future consideration.

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

jos koot

unread,
Aug 27, 2008, 6:41:45 AM8/27/08
to
On Aug 26, 6:19 pm, "narutocan...@gmail.com" <narutocan...@gmail.com>
wrote:

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

Phil Bewig

unread,
Aug 27, 2008, 8:54:34 AM8/27/08
to
On Aug 26, 12:19 pm, "narutocan...@gmail.com" <narutocan...@gmail.com>
wrote:

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.

namekuseijin

unread,
Aug 27, 2008, 12:51:24 PM8/27/08
to
On Aug 27, 9:54 am, Phil Bewig <pbe...@gmail.com> wrote:
> 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.

0 new messages