Схема путаницы в Let and Let * - PullRequest
4 голосов
/ 07 ноября 2011
(let ((x 2) (y 3)
  (let ((x 7)
        (z (+ x y)))
    (* z x)))

С кодом выше, почему ответ 35, а не 70?Во втором let, x равен 7, так что z должно быть 7 + 3 = 10, а затем результат должен быть 7 * 10 = 70. Я знаю, получил еще один пусть * Я очень смущаю это междузахватывает от Google.Я уже Google, но просто не могу получить это.

Ответы [ 2 ]

5 голосов
/ 07 ноября 2011

Расширить ответ Леппи: если вы написали

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

вы получите ответ, который ожидали. Внутренний let* в точности эквивалентен

(let ((x 7))
    (let ((z (+ x y)))
       (* z x)))

и фактически может быть реализовано таким образом в некоторых схемах.

Другими словами, в форме let* каждая последующая привязка после первой находится в области действия всех ранее созданных привязок.

2 голосов
/ 07 ноября 2011

x все еще привязан к внешнему let при вызове (+ x y).

...