Mam pytanie związane z programem, jak możemy zaimplementować let * jako wyrażenie lambda. Mówiąc dokładniej, nie zastanawiam się nad "zwykłym" letem, ale let with *, który pozwala nam używać jednego letego wyrażenia w innym.Jak wyrazić let * jako wyrażenie lambda (nie jest to dozwolone)
5
A
Odpowiedz
5
Formularz let*
to seria zagnieżdżonych lambda
s. Na przykład w ten sposób:
(let* ((a 10)
(b (+ 10 a)))
(+ a b))
jest równoważne to:
((lambda (a)
((lambda (b)
(+ a b))
(+ 10 a)))
10)
+0
Dzięki za odpowiedź, teraz ma to sens! –
4
Ponieważ nie zastanawiasz się o „regularnym” let
, jeśli let*
można przekształcić let
wtedy masz odpowiedź . Dlatego wiem, że:
(let* ((a ...) (b ...) (c ...)) body ...)
odpowiada:
(let ((a ...))
(let ((b ...))
(let ((c ...))
body ...)))
(patrz R5RS, strona 44, (define-syntax let* ...)
). Teraz, biorąc pod uwagę to, a wiedza, że:
(let ((a ...)) body ...)
odpowiada:
((lambda (a) body ...) ...)
do 'ekspansji' na let*
że pokazałem powyżej staje:
((lambda (a)
((lambda (b)
((lambda (c)
body ...)
<c-init>))
<b-init>))
<a-init>)
zajrzyj na: http://stackoverflow.com/questions/15003518/confused-by-the-difference-between-let-and-let-in-scheme/15006018#15006018 –
dzięki za link! –