Scheme “为什么闭包使用看起来如此”;鸡还是蛋;

Scheme “为什么闭包使用看起来如此”;鸡还是蛋;,scheme,lambda-calculus,Scheme,Lambda Calculus,我读过一些书,有些理解。我的问题是理解它背后的原因。我的第一个问题是盯着看 (define (cons x y) (lambda (m) (m x y))) 不理解这个函数实际上是如何考虑的。正如我从各种Lisp/Scheme书籍中了解到的,将东西放在列表中,即 (cons 1 ()) => (1) 怎么做 (define (cons x y) (lambda (m) (m x y))) 你喜欢思考吗?但当我脑子里的灯亮起时:cons只是car和cdr最终定义的一种占位符。所以汽

我读过一些书,有些理解。我的问题是理解它背后的原因。我的第一个问题是盯着看

(define (cons x y)
 (lambda (m) (m x y)))
不理解这个函数实际上是如何考虑的。正如我从各种Lisp/Scheme书籍中了解到的,将东西放在列表中,即

(cons 1 ()) => (1)
怎么做

(define (cons x y)
 (lambda (m) (m x y)))
你喜欢思考吗?但当我脑子里的灯亮起时:cons只是car和cdr最终定义的一种占位符。所以汽车是

 (define (car z)
   (z (lambda (p q) p)))
并且它预测一个即将到来的z。但这是什么?当我看到这个用法时:

 (car (cons 1 2))
我终于明白了,是的,cons函数的整体是z,也就是说,我们正在把cons传递给car!真奇怪

((lambda (m) (m 1 2)) (lambda (p q) p)) ; and then
((lambda (p q) p) 1 2)
这导致获取第一个表达式,因为基本的car操作可以被认为是一个if语句,其中布尔值为true,因此,获取第一个表达式

是的,所有的列表都可以被认为是组合在一起的表达式,但是我们通过这个奇怪的落后定义赢得了什么呢?这就好像任何初始的、独立的cons定义都不是密切相关的。就好像某个东西的用途定义了某个东西,就好像在它的用途限定它之前没有什么东西。这是闭包的主要用途吗?有人能给我举一些其他的例子吗

但是,我们通过这个奇怪的落后定义赢得了什么

练习的重点是证明数据结构可以完全按照函数定义;数据结构在语言中不必作为基本构造——如果您有函数(即闭包),这就足够了。这显示了函数的强大功能,对于函数编程之外的人来说,这可能令人难以置信


这并不是说在一个真正的项目中,我们会以这种方式定义数据结构。使用语言提供的数据结构构造将更有效。但重要的是要知道我们可以这样做。在计算机科学中,将一个结构(数据结构)“简化”为另一个结构(函数)是很有用的,这样,如果我们证明了第二个结构的某些东西,它也适用于第一个结构。

我认为我们做得再好不过了。而且,你应该尝试REPL中的不同步骤,自己看看。我理解奥斯卡。我不明白的是为什么我们要这么做?这种闭包有什么用途?其他例子。诸如此类,诸如此类,也看看我的脑袋。我认为这个cons/car/cdr定义是用来说明数据结构和算法可以从任何特定的内部表示方式中抽象出来。另一个例子是,使用适当的零定义以及succ和pred函数,您可以“构造”所有基本自然数数学(加法、减法、乘法、比较等),而无需使用语言固有的+、-、*运算符。它可能效率低下,但它将数字从任何内部二进制表示中抽象出来。
(1)
(1)()
是计算
(cons 1'())
时得到的表示,但它不是存储在内存中的实际对象。就像20和40是十进制数32的ok表示法,只是基数不同而已。如果您要制定自己的方案实施,您如何实施
cons
将决定
car
cdr
必须如何实施,以及您需要如何实施
读取和
显示。