Cosa significa "l'altra mia macchina è un CDR"?


89

Qualcuno esperto in lisp può spiegarmi questa barzelletta? Ho letto alcuni linguaggi di programmazione funzionale e so che CAR / CDR significano i contenuti del registro dell'indirizzo / decremento ma ancora non capisco bene l'umorismo.


10
inizia a "tramare" un po 'e poi capirai. Hahaha. è meglio di un adesivo per paraurti che dice "questo programmatore si ferma a tutte le raccolte di rifiuti".
gonzobrains

8
Circa mezz'ora dopo che questa domanda è stata collegata a da news.ycombinator.com/item?id=14416846, è stata messa in attesa. È una domanda di 8 anni. Fastidiosamente, non posso discutere contro lo stato di sospensione, ma non mi piace l'atmosfera di metterlo in attesa ora .
i336_

@ i336_ per la meta discussione , è chiuso per evitare che nuove risposte intasino la coda delle revisioni.
Andrew

2
Non ci sono altri motivi di attesa? L'opinione è ... sbagliato
Entendu

6
Non dovrebbe invece essere protetto?
Federico klez Culloca

Risposte:


134

In Lisp, un elemento della lista collegata è chiamato CONS. Si tratta di una struttura dati con due elementi, denominata CAR e CDR per ragioni storiche. (Alcuni programmatori Common Lisp preferiscono fare riferimento ad essi utilizzando le funzioni FIRST e REST, mentre altri come CAR e CDR perché si adattano bene alle versioni precomposte come (CADR x) ≡ (CAR (CDR x)).

Lo scherzo è una parodia degli adesivi per paraurti che a volte vedi su vecchie auto malandate che dicono "L'altra mia macchina è una Porsche / BMW / ecc."

La mia risposta a questa battuta è sempre stata "La mia altra AUTO è un CADR. CDR non è affatto un'AUTOMOBILE".


1
molto carino, ma non vero. Non dopo (rplacd a (car a))che manifestamente non lo farà. :) Common LISP non è Haskell. Ma grazie per la spiegazione. +1.
Will Ness

2
Non volevo spiegare la mia battuta, ma ... il punto è che il CDR operazione non è una macchina un'operazione ; questo è un problema separato dal fatto che i valori siano equivalenti o meno tramite RPLACD o altro.
Peter S. Housel

1
Inoltre, CDR suona come il nome di un'auto sportiva, facendo eco a TVR o GT-R, quindi si potrebbe leggere il testo e non rendersi nemmeno conto del significato più profondo, LISP-y.
grkvlt

4
Nel caso in cui qualcuno volesse sapere, CAR sta per Contenuto dell'indirizzo parte del numero di registro e CDR sta per contenuto della parte Decremento del numero di registro . Grazie, Wikipedia !
kojiro

1
Che ne dici di "Il mio altro carè first". :)
Kaz

34

Sì, sicuramente uno scherzo da geek.

I nomi vengono dall'IBM 704, ma non è uno scherzo.

La battuta è un (brutto) gioco di parole "l'altra mia macchina è una ___". Ma la barzelletta riguarda la ricorsione.

Quando si esegue un ciclo / manipolazione / selezione / invoca / altro in lisp si usa una combinazione di car (il primo elemento nell'elenco) e cdr (il resto dell'elenco) per destreggiarsi tra le funzioni.

Quindi hai una macchina, ma l'altra tua macchina è il tuo CDR perché puoi sempre ottenere un'auto da un CDR poiché il CDR è sempre (in ricorsione) più elementi. Prendilo? Ridi ancora?

Probabilmente dovrai imparare il lisp per ridacchiare un po ', oppure no. Ovviamente, a quel punto, probabilmente ti ritroverai a ridere a caso senza una ragione apparente perché:

Lisp ti rende pazzo.


2
E con il tuo ultimo respiro, è iniziato un altro gioco.
zxq9

14

// Venendo da schema
schema ha pochissime strutture di dati, uno di loro è una tupla: '(first . second). In questo caso, carè il primo elemento ed cdrè il secondo. Questo costrutto può essere esteso per creare elenchi, alberi e altre strutture.
La battuta non è molto divertente.


1
La tupla non sarebbe '(primo. Secondo)?
Ken

1
@Ken - di nuovo, non conosco lisp, ma lo schema non ha una sintassi così complessa. Anche le liste sono composte da coppie.
Kobi

3
In effetti, sarebbe più accurato dire che la tupla è (first . second). L'elenco '(first second)è composto da due tuple, così:(cons first (cons second null))
mqp

1
Kobi: Conosco Lisp e non sono sicuro di cosa intendi per "sintassi complessa". La sintassi punteggiata è il modo in cui scrivi le coppie in Lisp, incluso Scheme: gnu.org/software/mit-scheme/documentation/mit-scheme-ref/… . Il CDR di (primo secondo) è (secondo), non secondo.
Ken

2
Quindi, ora veniamo meno votati per essere stati corretti? Oh bene. Il sole splenderà.
Kobi
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.