#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)
.