使用lambda定义cons、car和cdr-它是如何工作的?

使用lambda定义cons、car和cdr-它是如何工作的?,lambda,scheme,sicp,r5rs,Lambda,Scheme,Sicp,R5rs,我似乎无法解释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))) (p-car (p-cons "foo" "bar")) -> foo (p-cdr (p-cons "foo "bar"))

我似乎无法解释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)))
(p-car (p-cons "foo" "bar")) -> foo
(p-cdr (p-cons "foo "bar")) -> bar
我知道第一个过程返回一个过程,该过程将一个过程作为参数,并将此过程应用于两个参数xy。我不明白的是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)))
(p-car (p-cons "foo" "bar")) -> foo
(p-cdr (p-cons "foo "bar")) -> bar

如果有人能解释这是如何工作的,我将不胜感激!例如,“car”和“cdr”中的lambda表达式如何获取“p”和“q”变量

只需做一个替换:

(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
只是创建一个lambda,该lambda需要一个过程来选择适当的存储值
p-car
选择第一个,
p-cdr
第二个。

我想这已经在另一个答案中描述过了这可能是重复的。或者我认为第一个链接的重复可能对你最有用。使用更好、更具暗示性的名称,如
(define(p-cons x y)(lambda(sel)(sel x y))
。现在很明显,
(p-cons x y)
创建了一个需要选择器过程的过程,并将给定给
p-cons的两个参数传递给它。然后,
car
仅提供第一个参数的选择器,以及第二个参数的
p-cdr
。非常感谢!我不敢相信我以前没有想过使用替代模型,我花了很长时间试图理解这一点。