2009-08-20 67 views
14

我的Lisp经验大部分来自Elisp。因此,我发现自己只是偶尔写Lisp。当我回到它时,我经常忘记carcdr之间的区别,并需要引用文档来慢跑我的记忆。你有记忆汽车和司机的意思助记符吗?

您使用什么类型的智能助记符来记住命名根源于1954 era computer architectures(car,cdr,cadr,caar,cddr等)的Lisp函数之间的区别?

此外,为什么firstrest这些知名别名获得了更多的吸引力,因为carcdr的惯用替代方案?

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

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

+1

为了以防万一 - 如果您将它们作为c.a.r和c.d.r阅读,它们会令人困惑。它们通常发音不同,粗略地称为“汽车”和“kooder”。 – 2009-08-20 03:12:18

+0

Lisp风格指南我读了一段时间后推荐用'first'和friends,'rest',和'nnth'来进行列表操作,'c [ad] + r'用于树木。 – 2011-06-29 01:13:16

回答

12

两个词CDR的是一个我听说过第一

+0

有一个助记符! – 2009-08-26 01:46:56

9

我没有助记符记住车/ CDR,虽然他们是按字母顺序排列(ad之前,从而carfirst)。

至于为什么他们坚持(像firstrest)?很大一部分可能只是动力,但另一个是你已经写了。你可以很容易地为他们写作文功能:

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

我认为在SICP视频中,他们还提到了另一个非显而易见的优势:您可以通过电话说“cadaddr”,并且立即可以理解,明确而且非常有效。如果你反而说“cdr”的“cdr”的“cdr”的“car”,或者“rest”的“rest”的“first”的“rest”的“first”,“rest”这会慢得多,很难正确理解,并且可能需要其他人在你说出来时同步写下来。 OTOH,没有什么能阻止你从*说*'caadar'和另一个人*写*'(car(car(car(car)(car ...))))' – 2009-08-20 09:20:26

+0

* aargh *我搞砸了。我的意思是:没有任何东西阻止你*说*'caadar'和另一个人*写*'(head(head(tail(head ...))))'或'(first(first(rest(first ...)) ))' – 2009-08-20 09:22:26

+0

谢谢。按字母顺序是我所考虑的。 – 2009-08-20 10:34:55

1

我没有汽车和司机的助记符。我的意思是,只有他们两个,如果你使用Lisp,在我看来你会知道。 (地狱,我甚至没有使用Lisp,我还记得)。

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

1

对于我来说,至少对于我来说,“car”和“cdr”就是你刚刚学习的东西,比如“left”和“right”这两个词的声音。

如果被解构的对象是一个列表,那么“first”和“rest”只有助记符。如果它是一个实际的缺点(即,一个虚线对),他们不会帮助。

他们陷入了困境,因为几乎五十年前,当LISP第一次被开发时,没有其他任何东西。所有的文章,所有的书籍,所有的代码都使用CAR和CDR,每个人都习惯了。

+0

在Elisp中,'first'和'rest'只是'cl'包中定义的'car'和'cdr'的别名。 – 2009-08-24 12:15:44

2

它们代表“地址寄存器的内容”和“减量寄存器的内容”,这些术语源自IBM 704机器体系结构。这不是那么有帮助!

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

+1

这不是一个真正的助记符,因为没有任何关于address = first和decrement = last的助记符。 – 2009-09-22 17:30:36

10

这是真的跛,但因为没有其他人提出什么...

车我是驱动的东西,所以这是第一个。 cdr是caboose;它来之后。

看,我告诉过你这是跛脚。

+0

至少你提出了一些建议。这更多的是我正在寻找的东西。 – 2009-08-20 10:26:35

0

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

+1

Clojure甚至不再拥有*'car'和'cdr'。 – 2009-08-20 09:13:38

+0

有趣。好信息。尽管如此,“汽车”和“cdr”确实在Elisp社区中更为普遍。可能是由于所有的旧包。 – 2009-08-20 10:33:15

0

如果你不关心是地道的,使用第一和休息。 car和cdr确实具有可以像caddr cddr等组合的组合的优点,如果你觉得有用的话。

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

1

我用的口诀是:

CAR - 复制阿尔法位置,并返回

CDR - 复制Dendrite公司(树部分 - 无根),并返回

我最近又回到了尝试Lisp,但希望这适合。

我倾向于认为列表作为α或根部位置的开始的。

如果第一个位置是根,我看惯了二叉树(可表示为列表),然后与树一个字似乎是为了。枝状结构具有正确的开头字母,似乎适合。它代表没有根的树的最后一个。

另取是从罗伯特·史密斯:

CAR - “Cell的前区”

CDR - “Cell的背部区域”

“我们可以得到电池的第二部分,我们姑且称之为这部分是背部区域(为什么不是后部?背部的意义与列表更有意义,因为列表的背部区域[1,2,3]是“接近末端”的部分,[2,3],而后面只是3)。“

从Lisp有太多的括号...(...或者所以他们说!)由罗伯特·史密斯,于2010年11月7日

Symbo1ics

我知道这不承担任何关于什么的缩写最初,但即使史蒂夫·罗素说:

“因为灵感的不幸临时流逝,我们想不出任何其他的名字比列表节点2个指针的‘地址’和‘减量’,所以我们称之为功能CAR用于“寄存器地址内容”和CDR用于“寄存器减量内容”

几个月后,在LISP上给了几个课,我们意识到“第一”和“休息”是更好的名字,我们(约翰麦卡锡,我和一些AI项目的其他人)试图让人们改用它们。

唉,已经来不及了!我们无法让它坚持下去。所以我们有CAR和CDR。“

The origin of CAR and CDR in LISP

+0

更好的是复制Alpha返回,复制树枝状返回 – 2013-11-30 04:27:46

0

您可以通过使用第一避免该问题,休息吧。

0

的书‘一个温柔的介绍Lisp的’做了解释像

真正大的一个了不起的工作

CADDDAADDR

从右侧开始外出时左(ADDDAADD),所以上述是(其中,->是“then”):CDR->CDR->CAR->CAR->CDR->CDR->CDR->CAR

为什么CAR & CDR被优先停留在firtrest原因是(我认为),因为它们可以被链接以形成功能,如上述。