Лямбда-исчисление очень экономно и вводится на основе минимального числа синтаксических элементов. В отличие от лямбда-выражения Лисп, лямбда-терм должен иметь лишь один формальный параметр!
Каждая функция от n параметров может быть преобразована в
функцию от n-1 и т.д.,
пока все параметры не будут абстрагированы
,
т.е. введены под собственную лямбду
:
(lambda (x y) ...)
=> (lambda (x) (lambda (y) ...))
(lambda (x y z) ...)
=> (lambda (x) (lambda (y) (lambda (z) ...)))
Эта методика называется каррированием (currying) в честь Хаскелла Карри (Haskell Curry, 1930), хотя изначально придумана Шейнфинклем (Schonfinkel, 1924).
(defvar combinator-T (lambda (x)
(lambda (y) x)))
(defvar combinator-F (lambda (x)
(lambda (y) y)))
;(funcall (funcall combinator-T 1) 2) => 1
;(funcall (funcall combinator-F 1) 2) => 2
(defvar combinator-if
(lambda (condition)
(lambda (then)
(lambda (else)
(funcall (funcall condition then) else)))))
(funcall (funcall (funcall combinator-if combinator-F)
(lambda () combinator-T))
(lambda () combinator-F))
(funcall (funcall (funcall combinator-if combinator-T)
(lambda () combinator-T))
(lambda () combinator-F))