Определение минусов, автомобиля и cdr с помощью лямбды — как это работает?

Кажется, я не могу объяснить, как работает это определение 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»?


person user16655    schedule 29.05.2015    source источник
comment
Я думаю, что это было описано в другом ответе   -  person Joshua Taylor    schedule 29.05.2015
comment
Это может быть дубликатом использования лямбда для определения cons/car/cdr в SICP.   -  person Joshua Taylor    schedule 29.05.2015
comment
Или Повторная реализация списков с замыканиями в схеме   -  person Joshua Taylor    schedule 29.05.2015
comment
Я думаю, что первый из этих связанных дубликатов, вероятно, наиболее полезен для вас.   -  person Joshua Taylor    schedule 29.05.2015
comment
используйте лучшие, более наводящие на размышления имена, например (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


Ответы (1)


Просто сделайте замену:

(p-car (p-cons "foo" "bar"))

;substituting p-cons:
(p-car (lambda (proc) (proc "foo" "bar")))

;substituting p-car:
((lambda (proc) (proc "foo" "bar")) (lambda (p q) p))

((lambda (p q) p) "foo" "bar")

"foo"

И аналогично для p-cdr.

По сути, p-cons просто создает лямбду, которая ожидает процедуру, которая выберет соответствующее сохраненное значение. p-car выбирает первое, p-cdr второе.

person Karoly Horvath    schedule 29.05.2015
comment
Большое спасибо! Я не могу поверить, что раньше не думал об использовании модели замещения, я потратил очень много времени, пытаясь понять это. - person user16655; 29.05.2015