2009-08-20 48 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原因是(我認爲),因爲它們可以被鏈接以形成功能,如上述。