Осмысливая итоги своей прошлой попытки понять LC, пришла мысль, довольно очевидная, которая почему-то не приходила раньше.
LC - это метапрограммирование в чистейшем виде. Любая апликация возвращает либо другую аппликацию, либо абстракцию, которая «ждет» аргумента, чтобы вновь применить и абстрагировать. Иными словами, любое выражение LC - это диспетчер, который принимает на вход другого диспетчера, и возвращает его же. Выражение в LC не может манипулировать реальными программами, оно манипулирует только метапрограммами!
Отсюда возникает интересное следствие. LC имеет своего рода «утечку абстракции», только в прпотивоположном направлении. Когда мы пишем «обычную» программу, мы «спускаемся вниз» по абстракции. Например, если мы пишем:
(lambda(x y) (x y))
(define tst
(((lambda(x) (lambda(y) (x y))) (lambda(x) x)) (lambda(x) (lambda(y) (x y)))))
(write ((tst (lambda(x) x)) 'b)) ; --> b