«...А чтобы вас убедить, я вас сейчас напугаю по-настоящему, показав, в каких терминах мы можем построить па́ры. Вы увидите, что — в то время как мы можем строить рациональные числа, отрезки, векторы и тому подобное в терминах пар — сами пары можно строить вообще из ничего. Как чистую абстракцию.
Давайте, я покажу вам слайд с реализацией CONS, CAR и CDR. Мы еще к ней вернемся, но — смотрите! — здесь не видно никаких данных, здесь видна только λ. Эта CONS будет возвращать процедуру, которая возвращает процедуру (так же, как возвращала процедуру AVERAGE):
(define (cons a b) (λ (pick) (cond ((= pick 1) a) ((= pick 2) b)))) (define (car x) (x 1)) (define (cdr x) (x 2))
CONS с аргументами A и B возвращает процедуру с параметром PICK, которая гласит: „Если PICK равен 1, я верну A, а если PICK равен 2, я верну B“, и именно она и будет CONS. CAR от X, от пары X, будет X, примененной к 1. Вам, возможно, непонятно, почему или как я это сделал, но это по крайней мере осмысленно, так как то, что конструируется посредством CONS, является процедурой, и CAR применяет ее к 1.
Подобным образом, CDR применяет ее к 2. Хорошо, я утверждаю, что это является представлением CONS, CAR и CDR, и заметьте, что никаких данных здесь нет. Что все это значит? Ну, если вы верите в то, чем мы занимаемся, тогда вы должны быть уверены, что для того, чтобы показать, что это есть представление CONS, CAR и CDR, мне достаточно лишь показать, что оно удовлетворяет аксиоме:
Аксиома о парах Для любых x и y (car (cons x y)) равняется x (cdr (cons x y)) равняется y
...»
Г. Абельсон. Структура и интерпретация компьютерной программы (лекции в «Hewlett-Packard», 1986 г, лекция 2B, 76:00).