En programación informática , cons( / ˈ k ɒ n z / o / ˈ k ɒ n s / ) es una función fundamental en la mayoría de los dialectos del lenguaje de programación Lisp . Construye objetos de memoria que contienen dos valores o punteros a dos valores. Estos objetos se denominan celdas (cons), conses, expresiones s no atómicas ("NATSes") o pares (cons) . En la jerga de Lisp, la expresión "to cons x onto y " significa construir un nuevo objeto con . El par resultante tiene una mitad izquierda, denominada (el primer elemento, o contenido de la parte de dirección del registro ) , y una mitad derecha, denominada (el segundo elemento, o contenido de la parte de decremento del registro ) .cons(cons xy)carcdr
Está vagamente relacionado con la noción de constructor en la programación orientada a objetos , que crea un nuevo objeto a partir de unos argumentos, y más estrechamente relacionado con la función constructora de un sistema de tipos de datos algebraicos .
La palabra "cons" y expresiones como "to cons onto" también forman parte de la jerga de la programación funcional . A veces, los operadores con una función similar, especialmente en el contexto del procesamiento de listas, se pronuncian "cons". (Un buen ejemplo es el ::operador en ML , Scala , F# , Lean , Rocq y Elm , o el :operador en Haskell , que añade un elemento al principio de una lista).
Usar
Aunque las celdas cons se pueden usar para almacenar pares de datos ordenados , se utilizan más comúnmente para construir estructuras de datos compuestas más complejas, en particular listas y árboles binarios .
Pares ordenados
Por ejemplo, la expresión Lisp construye una celda que contiene 1 en su mitad izquierda (el llamado campo) y 2 en su mitad derecha (el campo). En notación Lisp, el valor se ve así:(cons12)carcdr(cons12)
(1 . 2)
Nótese el punto entre 1 y 2; esto indica que la expresión S es un "par punteado" (un llamado "par cons"), en lugar de una "lista".
Liza

cons:( cons 42 ( cons 69 ( cons 613 nulo )))list:( lista 42 69 613 )En Lisp, las listas se implementan sobre pares cons. Más específicamente, cualquier estructura de lista en Lisp es:
- Una lista vacía
(), que es un objeto especial que normalmente se denominanil. - Una celda cons cuyo
cares el primer elemento de la lista y cuyocdres una lista que contiene el resto de los elementos.
Esto constituye la base de una estructura de lista enlazada simple cuyo contenido puede manipularse con cons, car, y cdr. Nótese que niles la única lista que no es también un par cons. Como ejemplo, consideremos una lista cuyos elementos son 1, 2 y 3. Dicha lista puede crearse en tres pasos:
- Contras 3 sobre
nil, la lista vacía - Contras 2 en el resultado
- Contras 1 en el resultado
lo cual es equivalente a la expresión única:
( cons 1 ( cons 2 ( cons 3 nulo )))o su abreviatura:
( lista 1 2 3 )El valor resultante es la lista:
(1 . (2 . (3 . ninguno)))
es decir
*--*--*--nulo | | | 1 2 3
que generalmente se abrevia como:
(1 2 3)
Por lo tanto, consse puede usar para agregar un elemento al principio de una lista enlazada existente. Por ejemplo, si x es la lista que definimos anteriormente, entonces producirá la lista:(cons5x)
(5 1 2 3)
Otro procedimiento de lista útil es append , que concatena dos listas existentes (es decir, combina dos listas en una sola).
Árboles
Los árboles binarios que solo almacenan datos en sus hojas también se construyen fácilmente con cons. Por ejemplo, el código:
( cons ( cons 1 2 ) ( cons 3 4 ))resultados en el árbol:
((1 . 2) . (3 . 4))
es decir
* / \ * * / \ / \ 1 2 3 4
Técnicamente, la lista (1 2 3) del ejemplo anterior también es un árbol binario, uno que resulta ser particularmente desequilibrado. Para comprobarlo, basta con reorganizar el diagrama:
*--*--*--nulo | | | 1 2 3
al siguiente equivalente:
* / \ 1 * / \ 2 * / \ 3 cero
Utilizar en una conversación
Las desventajas pueden referirse al proceso general de asignación de memoria , en contraposición al uso de operaciones destructivas del tipo que se usarían en un lenguaje de programación imperativo. Por ejemplo:
Aceleré un poco el código al agregar efectos secundarios en lugar de tenerlo ridículamente lento.
Implementación funcional
Dado que Lisp tiene funciones de primera clase , todas las estructuras de datos, incluidas las celdas cons, se pueden implementar usando funciones. Por ejemplo, en Scheme :
( define ( cons x y ) ( lambda ( m ) ( m x y ))) ( define ( car z ) ( z ( lambda ( p q ) p ))) ( define ( cdr z ) ( z ( lambda ( p q ) q )))Esta técnica se conoce como codificación de Church . Reimplementa las operaciones cons , car y cdr , utilizando una función como "celda cons". La codificación de Church es una forma habitual de definir estructuras de datos en el cálculo lambda puro , un modelo abstracto y teórico de computación estrechamente relacionado con Scheme.
Esta implementación, si bien resulta interesante desde el punto de vista académico, es poco práctica porque hace que las celdas cons sean indistinguibles de cualquier otro procedimiento de Scheme, además de introducir ineficiencias computacionales innecesarias.
Sin embargo, el mismo tipo de codificación puede utilizarse para tipos de datos algebraicos más complejos con variantes, donde incluso puede resultar más eficiente que otros tipos de codificación. [ 1 ] Esta codificación también tiene la ventaja de poder implementarse en un lenguaje de tipado estático que no tiene variantes, como Java , utilizando interfaces en lugar de expresiones lambda.
Véase también
Referencias
- ↑ "Interpretación eficiente mediante la transformación de tipos de datos y patrones en funciones" (PDF) . Archivado del original (PDF) el 31 de marzo de 2010. Consultado el 1 de marzo de 2009 .
Enlaces externos
- SDRAW , código Common Lisp para dibujar estructuras celulares. De David S. Touretzky.
- Programación funcional
- Lisp (lenguaje de programación)
- Tipos de datos compuestos
- Tipos de datos