Кажется, я не могу объяснить, как работает это определение cons, car и cdr:
(define (p-cons x y)
(lambda (proc) (proc x y)))
(define (p-car proc)
(proc (lambda (p q) p)))
(define (p-cdr proc)
(proc (lambda (p q) q)))
Я понимаю, что первая процедура возвращает процедуру, которая принимает процедуру в качестве аргумента и применяет эту процедуру к двум аргументам x y. Чего я не понимаю, так это того, как работает car и cdr:
(p-car (p-cons "foo" "bar")) -> foo
(p-cdr (p-cons "foo "bar")) -> bar
Если кто-то может объяснить, как это работает, я был бы признателен! Например, как лямбда-выражение в «car» и «cdr» получает переменные «p» и «q»?
(define (p-cons x y) (lambda (sel) (sel x y)))
. Теперь ясно, что(p-cons x y)
создает процедуру, которая ожидает селекторную процедуру, и передает ей два аргумента, которые были переданыp-cons
. Тогдаcar
просто предоставляет селектор 1-го аргумента, аp-cdr
- второго аргумента. - person Will Ness   schedule 01.06.2015