Схема функционирования - PullRequest
       1

Схема функционирования

0 голосов
/ 08 октября 2018

У меня вопрос по поводу схемы:

> (let ((x 2) (y 3))
>         (let ((x 7) (z (+ x y)))
>               (* z x) ) )

Результат: 35. Может кто-нибудь объяснить, почему?Что я не понимаю, так это то, что мы меняем значение x на 7, и, по моему мнению, результат должен быть 70.

Ответы [ 2 ]

0 голосов
/ 09 октября 2018

Определения в let -форме не могут ссылаться на более ранние привязки в той же let -форме;привязки ищутся в окружающей среде.
Таким образом, x - это 2 в (+ x y) и 7 в (* z x).

Другими словами,

(let ((a e1) (b e2))
    e3)

не эквивалентен

((lambda (a) ((lambda (b) e3) e2)) e1)

, но

((lambda (a b) e3) e1 e2)

Вы бы получили ожидаемое поведение, если бы использовали let*.

0 голосов
/ 09 октября 2018

На самом деле, Сильвестр, уже объяснил.

; I like to write `let` forms in this way:
(let ((x 2)
      (y 3))
  (let ((x 7)
        (z (+ x y))) ; since this is within a `let` definition part,
                     ; and not in a `let*` definition part, 
                     ; the definition of z - which is (+ x y) - 
                     ; cannot "see" (x 7) yet,
                     ; so it "searches" for x and "finds" it above 
                     ; in the let definition (x 2).
                     ; therefore, (z (+ x y)) will be evaluated as 
                     ; (z (+ 2 3)) thus (z 5)
    (* z x)))        ; this now is in the inner-let body,
                     ; thus it "sees" (x 7) which has "shadowed" (x 2)
                     ; therefore this will be evaluated as (* 5 7), thus 35.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...