2013-05-22 21 views
5

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)

+1

zajrzyj na: http://stackoverflow.com/questions/15003518/confused-by-the-difference-between-let-and-let-in-scheme/15006018#15006018 –

+0

dzięki za link! –

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>)