Схема запутывания Let и пусть*

#scheme #let

#схема #пусть

Вопрос:

 (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. Я знаю, что есть еще один let *, я очень запутан между этими 2. Образец взят из Google. Я уже гуглю, но просто не могу ее получить.

Ответ №1:

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

 (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:

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