[我的大部分Lisp经验都来自Elisp。因此,我发现自己只是偶尔写Lisp。当我回到它的时候,我常常忘记了car
和cdr
之间的区别,需要参考文档来慢跑我的记忆。
您使用哪种聪明的助记符来记住Lisp函数之间的区别,这些Lisp函数的命名根源于1954 era computer architectures(汽车,cdr,cadr,caar,cddr等)?
此外,为什么first
和rest
的别名不能作为car
和cdr
的惯用替代品而获得更大的吸引力?
Update:我知道car
and cdr
的实际定义以及如何发音。请仅使用助记符。
完全公开:这个问题并不完全适合我。这是为了帮助其他Lisp新手克服一些最初的障碍。
两个词car和cdr中,car是我听到的first。
您可以通过使用first和rest来避免此问题。
[《 Lisp的温和入门》这本书很好地解释了像这样的大人物>>
CADDDAADDR
[从右侧开始向左移动(ADDDAADD),因此以上是(其中
first
为“然后”):rest
。
[->
和CDR->CDR->CAR->CAR->CDR->CDR->CDR->CAR
优先于CAR
和CDR
的原因是(我认为),因为它们可以链接以形成上述功能。
上面的书的完整参考是David S. Touretzky撰写的“ Common Lisp对符号计算的温和介绍”。可从以下日期(2019年11月)开始使用:firt
这真是la脚,但由于没有其他人提出任何建议...
对我来说,开车是汽车,所以这是第一。 cdr是守车;它来了。
看,我告诉你这很la脚。
我没有记住汽车/ cdr的助记符,尽管它们是字母的(car
在cdr
之前,因此a
是d
)。
关于他们为什么坚持(针对car
和first
之类的东西?很大一部分可能只是动量,而另一部分是您已经写的。您可以轻松地为它们编写合成函数:
first
它们代表“地址寄存器的内容”和“减量寄存器的内容”,它们是从IBM 704机器体系结构派生的术语。但这并不能帮助您!
请参见rest
我没有用于汽车和cdr的助记符。我的意思是,只有这两个,如果您完全使用Lisp,在我看来,您就会知道。 (地狱,我什至不使用Lisp,我还记得。)
除了方便的合成之外,car和cdr相对于first和rest具有以下优点:(1)较短,(2)彼此相同的长度,(3)它们出现得较早。
至少对我来说,“汽车”和“ cdr”是您刚刚学习的东西,例如“左”和“右”两个字的发音。
“ first”和“ rest”仅在要解构的对象是列表的情况下才是助记符。如果这是一个实际的缺点(例如,虚线对),它们将无济于事。
他们之所以坚持,是因为大约50年前LISP最初开发时,没有其他东西。所有文章,所有书籍,所有代码都使用CAR和CDR,并且每个人都习惯了。
我使用的助记符是:
CAR-复制Alpha位置并返回
CDR-复制树突(树部分-没有根)并返回
我最近重新尝试使用Lisp,但希望这样适合。
[我倾向于将列表的开头视为alpha或根位置。
如果第一个位置是根,并且我习惯于看到二叉树(可以表示为列表),那么与树相关的单词似乎是有序的。 Dendrite的开头字母正确,而且似乎合适。它代表了没有根的树的最后一个。
[另一位来自罗伯特·史密斯:
CAR-“细胞的前区”
CDR-“细胞的背区”
“”我们可以得到单元格的第二部分。我们称此部分为背侧区域(为什么不后侧?背侧的含义在列表中更有意义,因为列表的背侧区域[1,2,3]是“接近末端”的部分,[2,3],而后部将是3)。“
来自Lisp,括号太多……(……或者这样说!)罗伯特·史密斯,2010年11月7日,
(caadar ...) -> (car (car (cdr (car ...))))
我知道这与最初的缩写无关,但甚至史蒂夫·罗素都说过:
“由于不幸的是灵感暂时消失,我们无法想到列表节点中2个指针的其他名称,除了” address“和” decrement“之外,因此我们将函数CAR称为” Address of Address of Contents“。寄存器”和“减少寄存器内容”的CDR。
[几个月后,在LISP中上了几节课,我们意识到“第一”和“其余”是更好的名字,我们(约翰·麦卡锡,我和AI项目的其余部分)试图让人们使用相反。
A,为时已晚!我们根本无法坚持下去。因此,我们有CAR和CDR。“
我实际上很少看到Symbo1ics和The origin of CAR and CDR in LISP,更经常地我在代码中看到car
和cdr
。因此,我不能同意那些名叫的人没有受到关注。
如果您不习惯于习惯用法,请先休息。如果发现有用的话,car和cdr的优点是可以组合成caddr cddr等组合。
否则,汽车是第一位,并且按字母顺序是第二位。