Давайте посмотрим на это снова ...
((lambda (x y) (x y)) (lambda (x) (* x x)) (* 3 3))
Чтобы оценить форму, мы оцениваем каждую ее часть по очереди. У нас есть три элемента в нашей форме. Этот находится на первой (функциональной) позиции:
(lambda (x y) (x y))
Это второй элемент формы и первый аргумент функции:
(lambda (x) (* x x))
Последний элемент формы, поэтому второй аргумент функции.
(* 3 3)
В этом случае порядок оценки не имеет значения, поэтому давайте начнем с левой стороны.
(lambda (x y) (x y))
Lambda создает функцию, поэтому она оценивает функцию, которая принимает два аргумента, x и y, а затем применяет x к y (другими словами, вызывает x с одним аргументом y). Давайте назовем это call-1 .
(lambda (x) (* x x))
Это вычисляет функцию, которая принимает один аргумент и возвращает квадрат этого аргумента. Таким образом, мы можем просто назвать это квадрат .
(* 3 3)
Это, очевидно, оценивается как 9 .
ОК, поэтому после первого запуска оценки мы имеем:
(call-1 square 9)
Для оценки этого мы вызываем call-1 с двумя аргументами: square и 9 Применение call-1 дает нам:
(square 9)
Так как это то, что делает call-1 - он вызывает свой первый аргумент со своим вторым аргументом. Теперь квадрат 9 равен 81 , что является значением всего выражения.