2016-04-03 4 views
0

Я пытаюсь понять, почему этот код схемы возвращает значение 36. Я не понимаю, как именно связывают переменные.Что возвращает следующий код в Scheme

(((lambda (fn) 
    (lambda(x)(fn (fn x)))) 
    (lambda (x) (* x 3))) 
4) 

Если кто-то может обеспечить всесторонний обход этого кода, это было бы очень полезно в моих исследованиях. Спасибо.

ответ

3

Использовать принцип замещения для оценки кода. Имея свой код с отступом красиво, как вы сделали это полезно, потому что вы можете легко увидеть, какие выражения могут быть подключены к лямбдах

(((lambda (fn) (lambda(x) (fn (fn x)))) (lambda (x) (* x 3))) 4) 

Во-первых, мы подставим в (lambda (x) (* x 3)) для fn

((lambda(x) ((lambda (x) (* x 3)) ((lambda (x) (* x 3)) x))) 4) 

Теперь мы будем заменить в 4 для внешней x

((lambda (x) (* x 3)) ((lambda (x) (* x 3)) 4)) 

Теперь мы подставим в 4 в течение x на правой стороне лямбда

((lambda (x) (* x 3)) (* 4 3)) 

Оценка (* 4 3)

((lambda (x) (* x 3)) 12) 

Заменитель 12 для x

(* 12 3) 

Оценка

36 
Смежные вопросы