“我的另一辆车是CDR”是什么意思?


89

精通Lisp的人可以向我解释这个笑话吗?我已经阅读了一些有关函数式编程语言的文章,并且知道CAR / CDR意味着地址/减量寄存器的内容,但我仍然不太了解这种幽默。


10
开始一点“计划”,然后您就会明白。哈哈哈 这比保险杠上写着“该程序员停止所有垃圾收集”要好。
gonzobrains 2011年

8
在从news.ycombinator.com/item?id=14416846链接到此问题大约半小时后,该请求已被搁置。这是一个有8年历史的问题。令人讨厌的是,我不能反对保留状态,但是我不喜欢现在将其保留的氛围。
i336_

@ i336_根据meta讨论关闭,以防止新答案阻塞审阅队列。
安德鲁

2
没有其他保留原因吗?基于观点的观点是错误的
Entendu

6
应该保护它吗?
Federico klez Culloca's

Answers:


134

在Lisp中,链接列表元素称为CON​​S。由于历史原因,它是一个具有两个元素的数据结构,称为CAR和CDR。(一些Common Lisp程序员更喜欢使用FIRST和REST函数来引用它们,而其他人喜欢CAR和CDR,因为它们与(CADR x)≡(CAR(CDR x))等预先编写的版本非常吻合。

这个玩笑是有时在旧车上看到的保险杠贴纸的戏仿,上面写着“我的另一辆车是保时捷/宝马/等”。

这个笑话的回应一直是“我的另一个CAR是CADR。CDR根本不是CAR。”


1
非常好,但事实并非如此。(rplacd a (car a))显然之后不会。:)常见的LISP不是Haskell。但是,谢谢您的解释。+1。
尼斯

2
我不想解释我的笑话,但是...重点是CDR 操作不是CAR 操作;这与通过RPLACD或其他方法获得的值是否相等是一个单独的问题。
彼得·豪斯

1
而且,CDR之类的声音就像跑车的名字一样,呼应TVR或GT-R,因此人们可以阅读文字甚至不了解更深的LISP-y含义。
grkvlt

4
如果有人想知道,CAR代表寄存器编号的Address部分的内容,而CDR代表寄存器编号的Decrement部分的内容。谢谢,维基百科
kojiro

1
“我的另一个carfirst” 怎么样。:)
Kaz

34

是的,绝对是个极客的笑话。

名称来自IBM 704,但这不是开玩笑。

“我的另一辆车是___”这个玩笑是(坏)双关语。但是笑话是关于递归的。

当您大声疾呼地循环/操纵/选择/调用/更多功能时,您可以组合使用car(列表中的第一个元素)和cdr(列表中的其余元素)来玩弄功能。

因此,您有一辆汽车,但您的另一辆汽车是您的cdr,因为您总是可以从cdr获得汽车,因为cdr总是(递归)更多元素。得到它?笑了吗?

您可能必须学习Lisp才能真正笑起来。当然,到那时,您可能会发现自己无缘无故地咯咯笑,因为:

Lisp使您显得loop肿。


2
最后一口气,另一场比赛开始了。
zxq9

14

//来自Scheme Scheme
Scheme的数据结构很少,其中一个是元组:'(first . second)。在这种情况下,car是第一个元素,cdr是第二个元素。可以扩展此构造以创建列表,树和其他结构。
这个笑话不是很有趣。


1
元组不是'(第一。第二)吗?

1
@Ken-再一次,我不懂Lisp,但是scheme没有这么复杂的语法。偶数列表是成对的。
科比

3
确实,说元组是更准确(first . second)。该列表'(first second)由两个元组组成,如下所示:(cons first (cons second null))
mqp

1
Kobi:我了解Lisp,而且我不确定您所说的“复杂语法”是什么意思。虚线语法是您在Lisp中编写对的方式,包括Scheme:gnu.org/software/mit-scheme/documentation/mit-scheme-ref/…。(第一秒)的cdr是(秒),而不是秒。

2
那么,现在我们因得到纠正而被否决了?那好吧。太阳会照耀着。
科比
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.