Перепишите выражение, используя let - PullRequest
0 голосов
/ 25 января 2019

Я преподавал язык схем, и в моем учебнике я нашел следующее выражение.Мой вопрос, почему он оценивает число 10?Может кто-нибудь, пожалуйста, объясните мне это?Значение того, какая локальная среда создана и какие привязки созданы к символам.Также я знаю, что каждое лямбда-выражение можно переписать с помощью let.Есть идеи, как это сделать?Буду признателен за любую помощь.

(let ((x 10)) 
  (define y (lambda (x) x)) 
  (define x 5) 
  (+ x (y x)))

1 Ответ

0 голосов
/ 26 января 2019

Ваш код в более читаемой форме:

(let ((x 10))
  (define y (lambda (x) x))
  (define x 5)
  (+ x (y x)))

Вы можете применить метод подстановки:

(+ x (y x)) ; ==>
(+ 5 (y 5)) ; ==>
(+ 5 ((lambda (x) x) 5)) ; ==>
(+ 5 5) ; ==>
10

Вы ошиблись. Каждый let может быть переписан как lambda, который немедленно называется:

(let ((a aexpr) (b bexpr))
  body ...)

; ==

((lambda (a b) body ...) aexpr bexpr)
...