2009-08-20 7 views
14

La mayor parte de mi experiencia Lisp viene de Elisp. Como tal, me encuentro escribiendo Lisp solo en ocasiones. En el momento en que vuelva a ella, a menudo se olvide la diferencia entre car y cdr y la necesidad de hacer referencia a la documentación para refrescar mi memoria.¿Tiene un mnemónico para recordar el significado de automóvil y cdr?

¿Qué tipos de mnemotécnicos inteligentes usas para recordar la diferencia entre las funciones de Lisp que han de nombres derivados de raíces 1954 era computer architectures (coche, CDR, cadr, caar, cddr, etc)?

Además, ¿por qué no los alias bien llamada de first y rest ganado más tracción como alternativas idiomáticas para car y cdr?

Actualización: Sé las definiciones reales de car and cdr y cómo se deben pronunciar. Mnemotecnia solo por favor.

Divulgación completa: Esta pregunta no es del todo para mí. Es para ayudar a otros recién llegados Lisp a superar algunos de los obstáculos iniciales.

+1

Por si acaso, si las está leyendo como c.a.r y c.d.r, serán confusas. Por lo general, se pronuncian de manera diferente, como "coche" y "kooder", más o menos. –

+0

Una guía de estilo Lisp que leí hace un tiempo me recomendó 'first' y friends,' rest', y 'nth' para la manipulación de listas y' c [ad] + r' para los árboles. –

Respuesta

12

de las dos palabras coche y CDR, coche es el que yo he oído primera.

+0

¡Hay un mnemónico! –

9

que no tienen mnemotécnicos para recordar coche/CDR, aunque son alfabético (a viene antes d, por lo tanto es carfirst).

En cuanto a por qué se pegan (sobre cosas como first y rest)? Una gran parte es probablemente solo el impulso, pero la otra es lo que ya escribiste. Se puede escribir fácilmente las funciones de composición para ellos:

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

Creo que en los videos del SICP, también mencionan otra ventaja no obvia: se puede decir "' cadaddr' "por teléfono, y es inmediatamente comprensible, inequívoco y muy eficiente. Si estuvieras diciendo "coche" de "cdr" de "carro" de "cdr" de "cdr" "o incluso" primero "de" resto "de" primero "de" resto "de" resto ", eso sería mucho más lento, mucho más difícil de entender correctamente, y probablemente requeriría que la otra persona lo escriba sincrónicamente mientras lo dices. OTOH, no hay nada que lo detenga * diciendo * 'caadar' y la otra persona * escribiendo *' (coche (coche (cdr (coche ...)))) ' –

+0

* aargh * Lo arruiné. Quise decir: no hay nada que lo detenga * diciendo * 'caadar' y la otra persona * escribiendo *' (cabeza (cabeza (cola (cabeza ...)))) 'o' (primero (primero (resto (primero ...)))) ' –

+0

Gracias. Alfabético es lo que he considerado también. –

1

no tengo mnemotécnicos para coche y CDR. Quiero decir, solo están los dos, y si usas Lisp, me parece que solo lo sabrías. (Diablos, ni siquiera uso Lisp y puedo recordarlo)

Además de la conveniente composición, el coche y el cdr tienen las siguientes ventajas sobre el primero y el resto: (1) más corto, (2) la misma longitud que el otro , (3) aparecieron antes.

1

"coche" y "CDR", al menos para mí, son cosas que acaba de aprender, como los sonidos de las palabras "izquierda" y "derecha".

"primera" y "resto" son solamente mnemotécnico si el objeto que está siendo deconstruido es una lista. Si se trata de una desventaja real (es decir, un par de puntos), no ayudan.

Se mantuvieron porque no había ninguna otra cosa, hace casi cincuenta años, cuando LISP fue desarrollado por primera vez. Todos los artículos, todos los libros, todo el código utilizó CAR y CDR, y todos se acostumbraron.

+0

En Elisp 'first' y' rest' son solo alias para 'car' y' cdr' definidos en el paquete 'cl'. –

2

Representan "Contenido del registro de direcciones" y "contenido del registro de decremento", términos derivados de la arquitectura de la máquina IBM 704. ¡No es que eso te ayude mucho!

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

+1

Esto no es realmente una frase mnemotécnica porque no hay nada de nemotécnico sobre address = first y decrement = last. –

10

Ésta es una porquería, pero ya que nadie más ha sugerido nada ...

coche para mí es lo que impulsa, por lo que es en primer lugar. cdr es el vagón de cola; viene después

Sede, le dijo que era cojo.

+0

Al menos sugirió algo.Eso es más de lo que estaba buscando. –

0

que en realidad rara vez veo car y cdr, mucho más a menudo veo first y rest en el código. Así que no puedo aceptar que los nombrados no hayan ganado tracción.

+1

Clojure ni siquiera * tiene * 'car' y' cdr' más. –

+0

Interesante. Buena información. 'car' y' cdr' parecen más frecuentes en la comunidad Elisp. Probablemente debido a todos los paquetes antiguos. –

0

Si no te importa ser idiomático, usa primero y descansa. coche y cdr tienen la ventaja de poder integrarse en combinaciones como caddr cddr, etc., si le resulta útil.

De lo contrario, el automóvil es primero y alfabéticamente es el primero de los dos.

1

Los mnemónicos que utilizo son:

CAR - Copia posición alfa y devolución

CDR - Copia de la dendrita (parte del árbol - sin la raíz) y el retorno

estoy recién volviendo a intentando Lisp, pero espero que esto encaje.

Tiendo a pensar en el comienzo de una lista como la posición alfa o raíz.

Si la primera posición es la raíz, y estoy acostumbrado a ver árboles binarios (que se pueden representar como una lista), entonces una palabra relacionada con los árboles parece estar en orden. Dendrite tiene la letra inicial correcta y parece encajar. Representa el último del árbol sin la raíz.

Otra toma es de Robert Smith:.

CAR - "región anterior de la célula"

CDR - "Dorsal Región de la célula"

"Podemos obtener la segunda parte de la célula Llamemos esta parte de la región dorsal (¿por qué no posterior? El significado de dorsal tiene más sentido con las listas, en el sentido de que la región dorsal de una lista [1,2,3] es la parte "cerca del final", [2,3], mientras que el posterior sería simplemente 3) ".

de Lisp tiene demasiados paréntesis, ... (... o eso dicen!) Por Robert Smith, el 7 de noviembre, 2010

Symbo1ics

Sé que esto no tiene relación con lo que eran originalmente las siglas, pero incluso Steve Russell dijo:

"Debido a un desafortunado lapso temporal de inspiración, no pudimos pensar en ningún otro nombre para los 2 indicadores en un nodo de lista que" dirección "y" decremento ", así que llamamos al funciones CAR para "Contenido de la Dirección de Registro" y CDR para "Contenido de Decremento de Registro".

Después de varios meses y dando algunas clases en LISP, nos dimos cuenta de que "primero" y "descansar" eran mejores nombres, y nosotros (John McCarthy, yo y parte del resto del Proyecto AI) intentamos conseguir gente para usarlos en su lugar.

¡Ay, ya era demasiado tarde! No pudimos hacer que se quedara para nada. Entonces tenemos CAR y CDR."

The origin of CAR and CDR in LISP

+0

Mejor aún Copiar devolución alfabética, Copiar dendrita Volver –

0

podría evitar el problema utilizando primero y descansar en su lugar.

0

El libro 'Una suave introducción a Lisp' hace un gran trabajo de explicar los realmente grandes como

CADDDAADDR

de inicio desde la banda derecha va a la izquierda (ADDDAADD), lo que lo anterior es (donde -> es "entonces"): CDR->CDR->CAR->CAR->CDR->CDR->CDR->CAR.

La razón por la CAR & CDR se hubiese gustado estar más firt y rest es (creo), ya que pueden ser encadenados para formar funciones como el anterior.

Cuestiones relacionadas