Нужна помощь в понимании привязок в коде схемы - PullRequest
3 голосов
/ 06 декабря 2010

Для приведенного ниже кода я не могу понять, как происходят привязки (x, y, z).Пожалуйста, ознакомьтесь с кодом, я объясню мою проблему более подробно ниже:

(define (w x)
  (lambda (y z)
    (begin 
      (set! x (+ (* y x) z)) x)))
(define f1 (w 3))
(f1 4 2)
(f1 2 1)

Вывод 14, 29. Это значения для х.

Это означает, изначально, х= 3, y = 4, z = 2.Во втором вызове, т. Е. (F1 2 1), x = 14, y = 2, z = 1.

Мои сомнения:

Как сначала происходит связывание, почему x= 3, y = 4 и z = 2?Если это имеет отношение к лямбда-выражению в функции, пожалуйста, опишите подробно, как оно работает. У меня такое чувство, что мое понимание нарушается.

Далее, почему первоначальный ответ x =14 сохраняется во втором вызове, т.е. (f1 2 1)?

Спасибо, что заглянули в это:)

1 Ответ

4 голосов
/ 06 декабря 2010

При запуске w создается закрытие из внутренней лямбды. Поскольку x пришло извне этой внутренней лямбды, x хранится внутри этого замыкания (в данном случае f1).

Итак, f1 имеет переменную внутри, которая представляет x, и начинается с 3. Когда вы запускаете f1, он оценивает математику и затем устанавливает свою собственную x быть 14.

Мораль в том, что lambda - это больше, чем просто код; это код в сочетании с переменными, которые он закрывает над , например, x.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...