Каррирование

Лямбда-исчисление очень экономно и вводится на основе минимального числа синтаксических элементов. В отличие от лямбда-выражения Лисп, лямбда-терм должен иметь лишь один формальный параметр!

Каждая функция от 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))