Was bedeutet "mein anderes Auto ist ein CDR"?

89

Kann mir jemand, der sich mit Lisp auskennt, diesen Witz erklären? Ich habe einige funktionale Programmiersprachen gelesen und weiß, dass CAR / CDR den Inhalt des Adress- / Dekrementregisters bedeutet, aber ich verstehe den Humor immer noch nicht wirklich.

CaptainCasey
quelle
10
Fangen Sie an, ein bisschen herumzuspielen, und dann werden Sie verstehen. hahaha. Es ist besser als ein Autoaufkleber mit der Aufschrift "Dieser Programmierer hält bei allen Speicherbereinigungen an."
Gonzobrains
8
Ungefähr eine halbe Stunde, nachdem diese Frage von news.ycombinator.com/item?id=14416846 verlinkt wurde , wurde sie zurückgestellt. Es ist eine 8 Jahre alte Frage. Ärgerlicherweise kann ich nicht gegen den Wartestatus argumentieren, aber ich mag es nicht, ihn jetzt in die Warteschleife zu stellen .
i336_
@ i336_ pro der Meta - Diskussion ist es geschlossen neue Antworten die Warteschlange für ein Verstopfen zu verhindern.
Andrew
2
Gibt es keine anderen Haltegründe? Meinungsbasiert ist ... falsch
Entendu
6
Sollte es nicht stattdessen geschützt werden?
Federico klez Culloca

Antworten:

133

In Lisp wird ein verknüpftes Listenelement als CONS bezeichnet. Es handelt sich um eine Datenstruktur mit zwei Elementen, die aus historischen Gründen als CAR und CDR bezeichnet wird. (Einige Common Lisp-Programmierer bevorzugen es, mit den Funktionen FIRST und REST auf sie zu verweisen, während andere CAR und CDR mögen, weil sie gut zu den vorkomponierten Versionen wie (CADR x) ≡ (CAR (CDR x)) passen.)

Der Witz ist eine Parodie auf die Autoaufkleber, die man manchmal auf verprügelten alten Autos sieht, die sagen: "Mein anderes Auto ist ein Porsche / BMW / etc."

Meine Antwort auf diesen Witz war immer: "Mein anderes CAR ist ein CADR. CDR ist überhaupt kein CAR."

Peter S. Housel
quelle
1
sehr schön, aber nicht wahr. Nicht nachdem (rplacd a (car a))es offensichtlich nicht wird. :) Common LISP ist nicht Haskell. Aber danke für die Erklärung. +1.
Will Ness
2
Ich wollte meinen Witz nicht erklären, aber ... der Punkt ist, dass die CDR- Operation keine CAR- Operation ist ; Dies ist eine andere Frage als die Frage, ob die Werte über RPLACD oder was auch immer äquivalent sind.
Peter S. Housel
1
Außerdem klingt CDR wie der Name eines Sportwagens, der TVR oder GT-R widerspiegelt, sodass man den Text lesen und nicht einmal die tiefere LISP-y-Bedeutung erkennen kann.
Grkvlt
4
Falls jemand es wissen möchte, steht CAR für Inhalt des Adressteils der Registernummer und CDR für Inhalt des Dekrementteils der Registernummer . Danke, Wikipedia !
Kojiro
1
Wie wäre es mit "Mein anderer carist first". :)
Kaz
34

Ja, definitiv ein Geek-Witz.

Die Namen stammen von IBM 704, aber das ist kein Scherz.

Der Witz ist (schlechtes) Wortspiel auf "Mein anderes Auto ist ein ___." Aber der Scherz handelt von Rekursion.

Wenn Sie in lisp eine Schleife / Manipulation / Auswahl / Aufruf / mehr ausführen, verwenden Sie eine Kombination aus Auto (das erste Element in der Liste) und CDR (der Rest der Liste), um Funktionen zu jonglieren.

Sie haben also ein Auto, aber Ihr anderes Auto ist Ihre CDR, weil Sie immer ein Auto von einer CDR bekommen können, da die CDR immer (in Rekursion) mehr Elemente enthält. Kapiert? Noch lachen?

Sie müssen wahrscheinlich lisp lernen, um tatsächlich ein bisschen zu kichern oder nicht. Natürlich werden Sie bis dahin wahrscheinlich ohne ersichtlichen Grund zufällig kichern, weil:

Lisp macht dich verrückt.

Zen
quelle
2
Und mit deinem letzten Atemzug begann ein weiteres Spiel.
zxq9
14

// Aus dem Schema kommen Das
Schema hat nur sehr wenige Datenstrukturen, eine davon ist ein Tupel : '(first . second). In diesem Fall carist das erste Element und cdrist das zweite. Dieses Konstrukt kann erweitert werden, um Listen, Bäume und andere Strukturen zu erstellen.
Der Witz ist nicht sehr lustig.

Kobi
quelle
1
Wäre das Tupel nicht '(erste. Zweite)?
Ken
1
@ Ken - wieder kenne ich lisp nicht, aber das Schema hat keine so komplexe Syntax. Sogar Listen bestehen aus Paaren.
Kobi
3
In der Tat wäre es genauer zu sagen, dass das Tupel ist (first . second). Die Liste '(first second)besteht aus zwei Tupeln, wie (cons first (cons second null))
folgt
1
Kobi: Ich kenne Lisp und bin mir nicht sicher, was Sie unter "komplexer Syntax" verstehen. Mit der gepunkteten Syntax schreiben Sie Paare in Lisp, einschließlich Schema: gnu.org/software/mit-scheme/documentation/mit-scheme-ref/… . Die cdr von (erste Sekunde) ist (zweite), nicht zweite.
Ken
2
Also, jetzt werden wir für die Korrektur herabgestimmt? Naja. Die Sonne wird scheinen.
Kobi