你有记忆汽车和cdr意义的助记符吗?

时间:2009-08-20 02:40:16

标签: lisp elisp common-lisp

我的大多数Lisp体验都来自Elisp。因此,我发现自己只是偶尔编写Lisp。当我回到它时,我经常忘记carcdr之间的区别,需要引用文档来慢慢记忆。

你使用什么样的聪明助记符来记住源自1954 era computer architectures(car,cdr,cadr,caar,cddr等)的命名根源的Lisp函数之间的区别?

此外,为什么firstrest的名称别名不具备carcdr的惯用替代品?

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

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

12 个答案:

答案 0 :(得分:13)

car cdr 这两个词中, car 是我第一次听到的 。< / p>

答案 1 :(得分:11)

这真是太蹩脚了,但是因为没有人提出任何建议......

汽车对我来说是驱动的东西,所以它是第一个。 cdr是守车;它来了。

看,我告诉你这很蹩脚。

答案 2 :(得分:9)

我没有记住car / cdr的助记符,虽然它们是按字母顺序排列的(ad之前,因此carfirst)。

至于他们为什么坚持(对firstrest这样的事情)?很大一部分可能只是动力,但另一个是你已经写过的。您可以轻松地为它们编写组合函数:

(caadar ...) -> (car (car (cdr (car ...))))

答案 3 :(得分:3)

它们代表“地址寄存器的内容”和“减量寄存器的内容”,这些术语源自IBM 704机器架构。这并不能帮助你!

请参阅http://www.iwriteiam.nl/HaCAR_CDR.html

答案 4 :(得分:1)

我没有汽车和cdr的助记符。我的意思是,只有两个,如果你使用Lisp,在我看来你会知道。 (天啊,我甚至不使用Lisp,我记得。)

除了方便的构图外,汽车和cdr在第一次和休息时具有以下优点:(1)较短,(2)长度相同,(3)它们出现得更早。

答案 5 :(得分:1)

至少对我而言,“汽车”和“cdr”是你刚学到的东西,比如“左”和“右”这两个词的声音。

如果被解构的对象是一个列表,那么

“first”和“rest”只是助记符。如果它是实际的缺点(即点对),它们就无济于事。

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

答案 6 :(得分:1)

我使用的助记符是:

CAR - 复制Alpha位置并返回

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

我刚刚回到尝试Lisp,但希望这适合。

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

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

罗伯特·史密斯的另一个观点是:

CAR - “细胞的前区”

CDR - “细胞的背部区域”

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

来自Lisp的

有太多的括号......(......或者他们说的话!)作者:Robert Smith,2010年11月7日

Symbo1ics

我知道这与最初的首字母缩略词无关,但即使是史蒂夫罗素也说:

“由于不幸的临时失灵,我们无法想到列表节点中2个指针的任何其他名称,而不是”地址“和”减量“,所以我们将函数CAR称为”地址的内容“登记册“及”CDR“登记册减少内容”。

经过几个月的时间并在LISP上课,我们意识到“第一”和“休息”是更好的名字,而我们(John McCarthy,我和AI项目的其余部分)试图让人们去请改用它们。

唉,太晚了!我们根本无法坚持下去。所以我们有CAR和CDR。“

The origin of CAR and CDR in LISP

答案 7 :(得分:0)

我实际上很少看到carcdr,我经常在代码中看到firstrest。所以我不能同意那些名字没有获得牵引力。

答案 8 :(得分:0)

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

否则,汽车是第一个,它按字母顺序排在第一个。

答案 9 :(得分:0)

您可以通过使用first和rest来避免此问题。

答案 10 :(得分:0)

这本书&#34;一本温和的Lisp简介&#34;能很好地解释像

这样的大事
  

CADDDAADDR

从左侧开始(ADDDAADD),所以上面是(->是&#34;然后&#34;):CDR->CDR->CAR->CAR->CDR->CDR->CDR->CAR

CAR&amp; CDR优先于firtrest优先{我认为},因为它们可以被链接以形成上述功能。

答案 11 :(得分:0)

上面本书的完整参考文献是David S. Touretzky撰写的“ Common Lisp对符号计算的温和介绍”。可从以下日期(2019年11月)开始使用: https://www.cs.cmu.edu/~dst/LispBook/book.pdf

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

考虑一下由CAR获得的列表的第一个元素,如A所示,但使用的字体看起来像D的镜像。该字符指向(即,字符的曲面指向)'列表的开头。然后考虑一下由CDR所获得的其余列表,以D表示。D指向列表末尾的“ R”或“ R”。

由于这里对字体的限制,我将使用“ <|”表示字体中的A,这是围绕垂直轴的“ D”的反映。为了对称起见,我将用“ |>”表示D字符。

关于R = C ^ -1。然后CARCDR = CAC ^ -1CDR = CADR等表示为C <| RC |> R = C <||> R等。