Лямбда-исчисление очень экономно и вводится на основе минимального числа синтаксических элементов. В отличие от лямбда-выражения Лисп, лямбда-терм должен иметь лишь один формальный параметр!
Каждая функция от 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))