16

我的大部分 Lisp 经验来自 Elisp。因此,我发现自己只是偶尔写 Lisp。当我回到它时,我经常忘记和之间的区别carcdr需要参考文档来记忆。

你用什么聪明的助记符来记住 Lisp 函数之间的区别,这些函数的命名根源源于1954 年的计算机体系结构(car、cdr、cadr、caar、cddr 等)?

此外,为什么 和 的著名别名first并没有作为andrest的惯用替代品获得更多关注?carcdr

更新:我知道它们的实际定义car以及cdr它们应该如何发音。请只使用助记符。

完全披露:这个问题并不完全适合我。这是为了帮助其他 Lisp 新手克服一些最初的障碍。

4

12 回答 12

15

在carcdr两个词中,car是我一个听到的。

于 2009-08-25T12:30:27.067 回答
12

这真的很蹩脚,但因为没有其他人提出任何建议......

对我来说,汽车是驱动的东西,所以它是第一位的。cdr 是守车;它紧随其后。

看,我告诉过你这很蹩脚。

于 2009-08-20T03:35:15.350 回答
11

我没有记忆 car/cdr 的助记符,尽管它们是按字母顺序排列的(a在之前d,因此carfirst)。

至于他们为什么坚持(在和之类的东西上firstrest?很大一部分可能只是动力,但另一部分是你已经写的。您可以轻松地为它们编写组合函数:

(caadar ...) -> (car (car (cdr (car ...))))
于 2009-08-20T02:44:22.970 回答
5

它们代表“地址寄存器的内容”和“递减寄存器的内容”,这些术语源自 IBM 704 机器架构。并不是说这对你有多大帮助!

http://www.iwriteiam.nl/HaCAR_CDR.html

于 2009-08-20T02:53:47.403 回答
2

我没有 car 和 cdr 的助记符。我的意思是,只有他们两个,如果你使用 Lisp,在我看来你会 Just Know。(见鬼,我什至不使用 Lisp,我记得。)

除了方便的组合外,car 和 cdr 相对于 first 和 rest 具有以下优点:(1)更短,(2)彼此相同的长度,(3)它们出现得更早。

于 2009-08-20T02:51:56.593 回答
1

至少对我来说,“car”和“cdr”是你刚学的东西,就像“left”和“right”这两个词的发音一样。

“first”和“rest”仅在被解构的对象是一个列表时才具有助记性。如果它是一个实际的缺点(即,一个虚线对),它们没有帮助。

他们之所以停滞不前,是因为几乎 50 年前,当 LISP 首次开发时,没有别的东西了。所有的文章,所有的书籍,所有的代码都使用了CAR和CDR,每个人都习惯了。

于 2009-08-20T02:52:50.507 回答
1

如果您不关心惯用语,请先使用并休息。car 和 cdr 确实具有能够组合成诸如 caddr cddr 等组合的优点,如果您觉得这很有用的话。

否则,汽车是第一个,它是两者中的第一个。

于 2009-08-22T15:43:16.300 回答
1

我使用的助记符是:

CAR - 复制 Alpha 位置并返回

CDR - 复制树突(树部分 - 没有根)并返回

我最近又开始尝试 Lisp,但希望这适合。

我倾向于将列表的开头视为 alpha 或根位置。

如果第一个位置是根,并且我习惯于看到二叉树(可以表示为列表),那么与树相关的单词似乎是有序的。Dendrite 有正确的开头字母,似乎很合适。它表示没有根的树的最后一个。

另一个观点来自罗伯特史密斯:

CAR - “细胞的前部区域”

CDR - “细胞的背侧区域”

“我们可以得到细胞的第二部分。让我们称这部分为背侧区域(为什么不后侧?背侧的含义对列表更有意义,因为列表 [1,2,3] 的背侧区域是部分“接近尾声”,[2,3],而后面的只是 3)。

来自 Lisp 的括号太多……(……或者他们是这么说的!) 作者:Robert Smith,2010 年 11 月 7 日

符号学

我知道这与最初的首字母缩略词无关,但即使是 Steve Russell 也说过:

“由于不幸的灵感暂时失效,我们想不出除了“地址”和“减量”之外的任何其他名称的列表节点中的两个指针,因此我们将函数称为“寄存器地址内容”的函数 CAR和 CDR 为“寄存器递减的内容”。

几个月后,在 LISP 上上了几节课后,我们意识到“first”和“rest”是更好的名字,我们(John McCarthy、我和 AI 项目的其他一些人)试图让人们改用它们.

唉,为时已晚!我们根本无法让它坚持下去。所以我们有 CAR 和 CDR。”

LISP中CAR和CDR的由来

于 2013-11-30T03:20:33.833 回答
1

你可以通过使用 first and rest 来避免这个问题。

于 2013-11-30T04:52:31.423 回答
1

这本书“一个温和的 Lisp 简介”很好地解释了真正的大问题,比如

CADDDAADDR

从右侧开始向左(ADDDAADD),所以上面是(->“then” 在哪里) CDR->CDR->CAR->CAR->CDR->CDR->CDR->CAR:。

CAR优先使用&CDR的原因是(我认为)因为它们可以链接起来形成上述函数firtrest

于 2014-07-17T08:48:39.000 回答
0

我实际上很少看到carand cdr,更多时候我在代码中看到firstand 。rest所以我不能同意那些被命名的人没有获得关注。

于 2009-08-20T04:09:53.877 回答
0

对上述书籍的完整参考是 David S. Touretzky 的“Common Lisp A Gentle Introduction to Symbolic Computation”。可从以下网址获得(2019 年 11 月): https ://www.cs.cmu.edu/~dst/LispBook/book.pdf

我(很晚)对 CAR 和 CDR 助记符的建议是:

想一想由 CAR 获得的列表的第一个元素,由 A 表示,但其中一种字体看起来像 D 的镜像。这个字符指向(即字符的曲面指向)'C'omentmence的名单。然后想想由 D 表示的 CDR 获得的列表的其余部分。 D 指向列表后面的 'R'est 或余数。

由于这里对字体的限制,我将使用 '<|' 表示字体中的 A,它是“D”关于垂直轴的反射。为了对称,我将用“|>”表示 D 字符。

考虑 R = C^-1。然后 CARCDR=CAC^-1CDR=CADR 等由 C<|RC|>R = C<||>R 等表示。

于 2019-11-22T23:13:04.180 回答