Share to: share facebook share twitter share wa share telegram print page

 

CAR y CDR

car y cdr son operaciones primitivas sobre las celdas cons (o "expresiones S no atómicas") introducidas en el lenguaje de programación Lisp. Una celda cons se compone de dos punteros, la operación car extrae el primer puntero, y la operación cdr extrae el segundo.

Por lo tanto, la expresión (car (cons x y)) se evalúa como x , y (cdr (cons x y)) se evalúa como y.

Cuando las celdas cons son usadas para implementar listas enlazadas simples (en vez de árboles y otras estructuras más complicadas), la operación car devuelve el primer elemento de la lista, mientras que cdr devuelve el resto de la lista. Por esta razón, a las operaciones a veces se le dan los nombres de first y rest o head y tail (primero y resto o cabeza y cola).

Etimología

Lisp fue implementado originalmente en el computador IBM 704, a finales de los años 1950. El hardware del 704 tuvo un soporte especial para dividir una palabra de máquina de 36-bits en cuatro partes, una "address part" y "decrement part" ("parte dirección" y "parte decremento") de 15 bits cada una y una "prefix part" y "tag part" ("parte prefijo" y "parte tag") de tres bits cada una.

Precursores de Lisp incluye funciones:

  • car abreviación de "Contents of the Address part of Register number" (Contenido de la parte dirección del número de registro),
  • cdr "Contents of the Decrement part of Register number" (contenido de la parte decremento del número de registro),
  • cpr "Contents of the Prefix part of Register number" (contenido de la parte prefijo del número de registro), y
  • ctr "Contents of the Tag part of Register number" (contenido de la parte tag del número de registro),

cada uno de ellos tomaba una dirección de máquina como argumento, cargado la palabra correspondiente desde la memoria, y extrayendo los bits apropiados.

El macro de ensamblador del 704 para la instrucción cdr era:

LXD JLOC, 4
CLA 0,4
PDX 0,4
PXD 0,4[1]

Una palabra de máquina puede ser reensamblada por cons, que tomaba cuatro argumentos (a, d, p, t).

En las etapas iniciales del diseño de Lisp, las partes prefijo y tag eran descartadas dejando CAR, CDR, y un CONS de dos argumentos.[2]

Aceptación continuada

Los nombres alternativos first y rest, que se remontan al menos a 1959,[3]​ a veces son preferidos a car y cdr. Sin embargo, car y cdr tienen la ventaja de que cortas composiciones de funciones pueden dar nombres cortos y más o menos pronunciables de la misma forma. En Lisp, (cadr '(1 2 3)) es equivalente a (car (cdr '(1 2 3))); su valor es 2 (el primer elemento del resto de (1 2 3) ). Similarmente, (caar '((1 2) (3 4))) es lo mismo que (car (car '((1 2) (3 4)))); su valor es 1. La mayoría de los Lisps establecen un límite en el número de formas compuestas que soportan; Common Lisp y Scheme proporcionan formas con hasta cuatro repeticiones de la a y d. Sin embargo, otras composiciones pueden ser fácilmente definidas por el usuario.

Otros lenguajes de programación

Muchos lenguajes (particularmente lenguajes funcionales y lenguajes influenciados por el paradigma funcional) usan una lista enlazada simple como una estructura de datos básica, y proporcionan primitivas o funciones similares a car y cdr. Estas son nombradas como first y rest, head y tail, etc. En Lisp, sin embargo, la celdas cons no sólo son usadas para construir listas enlazadas, sino también para construir estructuras par y par anidadas, es decir, la cdr de una celda cons no necesita ser una lista. En este caso, la mayoría de los otros lenguajes proporciona diferentes primitivas, pues ellos distinguen estructuras par de estructuras de lista sea tipeado o semánticamente. Particularmente en lenguajes tipeados, las listas, pares, y los árboles todos tienen diferentes funciones de acceso con firmas de tipo diferentes: en Haskell, por ejemplo, el car y cdr se convierten en fst y snd cuando se trata de un tipo par. Analogías exactas del car y cdr son, por lo tanto, raras en otros lenguajes.

Referencias

  1. Portions from NILS' LISP PAGES- http://t3x.dyndns.org/LISP/QA/carcdr.html
  2. McCarthy, John (12 de febrero de 1979). «History of Lisp». 
  3. McCarthy, J., Erratum to Memo 8, Recursive Functions of Symbolic Expressions and Their Computation By Machine, dated March 13, 1959, retrieved September 19, 2008.
Notas
Kembali kehalaman sebelumnya


Index: pl ar de en es fr it arz nl ja pt ceb sv uk vi war zh ru af ast az bg zh-min-nan bn be ca cs cy da et el eo eu fa gl ko hi hr id he ka la lv lt hu mk ms min no nn ce uz kk ro simple sk sl sr sh fi ta tt th tg azb tr ur zh-yue hy my ace als am an hyw ban bjn map-bms ba be-tarask bcl bpy bar bs br cv nv eml hif fo fy ga gd gu hak ha hsb io ig ilo ia ie os is jv kn ht ku ckb ky mrj lb lij li lmo mai mg ml zh-classical mr xmf mzn cdo mn nap new ne frr oc mhr or as pa pnb ps pms nds crh qu sa sah sco sq scn si sd szl su sw tl shn te bug vec vo wa wuu yi yo diq bat-smg zu lad kbd ang smn ab roa-rup frp arc gn av ay bh bi bo bxr cbk-zam co za dag ary se pdc dv dsb myv ext fur gv gag inh ki glk gan guw xal haw rw kbp pam csb kw km kv koi kg gom ks gcr lo lbe ltg lez nia ln jbo lg mt mi tw mwl mdf mnw nqo fj nah na nds-nl nrm nov om pi pag pap pfl pcd krc kaa ksh rm rue sm sat sc trv stq nso sn cu so srn kab roa-tara tet tpi to chr tum tk tyv udm ug vep fiu-vro vls wo xh zea ty ak bm ch ny ee ff got iu ik kl mad cr pih ami pwn pnt dz rmy rn sg st tn ss ti din chy ts kcg ve 
Prefix: a b c d e f g h i j k l m n o p q r s t u v w x y z 0 1 2 3 4 5 6 7 8 9