Die Bindungen in let
kann nicht vor dem Körper der let
Form verwendet werden. So müssen Sie k
definieren:
(define k 99)
(let ((k 10)
(y (* 2 k))) ; the k here is not the one in the same `let`
(+ k y))
; ==> 208
let
ist nur Syntax Zucker für ein angerufenes anonymen Verfahren. Es ist gleich dieser:
((lambda (k y)
(+ k y))
10
(* 2 k))
Mit dieser Syntax ist vielleicht offensichtlich, dass k
nicht derjenige 10
zugeordnet sein kann?Es gibt eine andere Syntax namens let*
und es können Sie die bisherigen Bindungen verwenden:
(let* ((k 10)
(y (* 2 k))) ; the k here is not the one in the same `let`
(+ k y))
; ==> 30
Es ist gleich verschachtelte anonyme Prozedur aufruft:
((lambda (k)
((lambda (y)
(+ k y))
(* 2 k)))
10)
Hier ist es einfach, die k
in (* 2 k)
ist die eine Schranke sehen zu 10
.
Der erste Ausdruck sieht ziemlich gebrochen aus. Es fügt 'x' und' y' hinzu und vergisst das Ergebnis. Das einzige, was der Ausdruck tatsächlich tut, ist das Verdoppeln von "x", weil nur der Wert des letzten Ausdrucks von einer Funktion zurückgegeben wird. – ceving
Eine gebundene Bindung ist nicht gleichbedeutend mit einem Lambda, sie entspricht einem Lambda, das auf ein Argument angewendet wird. '(let ((x e)) body)' <=> '((lambda (x) body) e)'. – molbdnilo