let
внутри определения foo
и, следовательно, применение от goo
до a
, оценивается, когда определено foo
, а не когда foo
.
Посмотрите на это так: какова ценность foo? Это выражение lambda
. Привязка f
закрывается foo
, она не «переделывается» каждый раз, когда foo
оценивается.
Редактировать: вот пример без lambda
s
> (let ((x (sqrt 2))) (* x 3))
4.24264068711929
> (define bar (let ((x (sqrt 2))) (* x 3)))
> bar
4.24264068711929
>
Когда вы оцениваете bar
, вы больше не звоните sqrt
. bar
определяется как тело let
, в данном случае это число, являющееся результатом выражения.
В вашем примере тело let
является выражением lambda
. Но, как и в моем примере, привязка let
не выполняется повторно.