使用lambda定义cons、car和cdr-它是如何工作的?
我似乎无法解释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"))
(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
。非常感谢!我不敢相信我以前没有想过使用替代模型,我花了很长时间试图理解这一点。