stringtranslate.com

contras

En programación de computadoras , 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 . cons construye objetos de memoria que contienen dos valores o punteros a dos valores. Estos objetos se denominan células (contras), conses, expresiones s no atómicas ("NATS") o pares (contras) . En la jerga de Lisp, la expresión "convertir x en 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 del registro) . ecrementar parte del registro ) .(cons x y)carcdr

Está vagamente relacionado con la noción orientada a objetos de un constructor , que crea un nuevo objeto dados los argumentos, y más estrechamente relacionado con la función constructora de un sistema de tipos de datos algebraicos .

La palabra "contras" y expresiones como "to contras" también son parte de una jerga de programación funcional más general . A veces, los operadores que tienen un propósito similar, especialmente en el contexto del procesamiento de listas, se pronuncian como "contras". (Un buen ejemplo es el ::operador en ML , Scala , F# , Lean , Coq y Elm o el :operador en Haskell , que agrega un elemento al comienzo de una lista).

Usar

Aunque las celdas de contras se pueden usar para contener pares ordenados de datos, se usan 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í:(cons 1 2)carcdr(cons 1 2)

(1. 2)

Tenga en cuenta el punto entre 1 y 2; esto indica que la expresión S es un "par de puntos" (el llamado "par de contras"), en lugar de una "lista".

Liza

Diagrama de celdas de desventajas para la lista (42 69 613), escrito con cons:
( contras 42 ( contras 69 ( contras 613 nulo )))      
y escrito con list:
( lista 42 69 613 )   

En Lisp, las listas se implementan encima de los pares de contras. Más específicamente, cualquier estructura de lista en Lisp es:

  1. Una lista vacía (), que es un objeto especial normalmente llamado nil.
  2. Una celda de contras cuyo escar el primer elemento de la lista y cuya cdrlista contiene el resto de los elementos.

Esto forma la base de una estructura de lista simple y enlazada cuyo contenido se puede manipular con cons, cary cdr. Tenga en cuenta que niles la única lista que no es también un par de desventajas. Como ejemplo, considere una lista cuyos elementos son 1, 2 y 3. Dicha lista se puede crear en tres pasos:

  1. Contras 3 en nilla lista vacía
  2. Contras 2 sobre el resultado
  3. Contras 1 sobre el resultado

que es equivalente a la expresión única:

( contras 1 ( contras 2 ( contras 3 nulo )))      

o su abreviatura:

( lista 1 2 3 )   

El valor resultante es la lista:

(1 . (2 . (3 . nulo)))

es decir

*--*--*--nulo | | | 1 2 3

que generalmente se abrevia como:

(1 2 3)

Por lo tanto, consse puede utilizar para agregar un elemento al frente de una lista vinculada existente. Por ejemplo, si x es la lista que definimos anteriormente, producirá la lista:(cons 5 x)

(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 sólo almacenan datos en sus hojas también se construyen fácilmente con cons. Por ejemplo, el código:

( contras ( contras 1 2 ) ( contras 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, que resulta estar particularmente desequilibrado. Para ver esto, simplemente reorganice el diagrama:

*--*--*--nulo | | | 1 2 3

al siguiente equivalente:

 * /\ 1 * /\ 2 * /\ 3 cero

Usar en conversación

Los contras pueden referirse al proceso general de asignación de memoria , en lugar de usar operaciones destructivas del tipo que se usarían en un lenguaje de programación imperativo. [ cita necesaria ] Por ejemplo:

Aceleré un poco el código agregando efectos secundarios en lugar de tener desventajas ridículas.

Implementación funcional

Dado que Lisp tiene funciones de primera clase , todas las estructuras de datos, incluidas las celdas contras, se pueden implementar mediante funciones. Por ejemplo, en el esquema :

( definir ( cons x y ) ( lambda ( m ) ( m x y ))) ( definir ( car z ) ( z ( lambda ( p q ) p ))) ( definir ( cdr z ) ( z ( lambda ( p q ) q )))                      

Esta técnica se conoce como codificación Church . Vuelve a implementar las operaciones cons , car y cdr , utilizando una función como "celda de contras". La codificación Church es una forma habitual de definir estructuras de datos en cálculo lambda puro , un modelo de cálculo teórico abstracto que está estrechamente relacionado con Scheme.

Esta implementación, aunque académicamente interesante, no es práctica porque hace que las celdas de contras sean indistinguibles de cualquier otro procedimiento de Scheme, además de introducir ineficiencias computacionales innecesarias.

Sin embargo, el mismo tipo de codificación se puede utilizar 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 ser implementable en un lenguaje de tipo estático que no tiene variantes, como Java , utilizando interfaces en lugar de lambdas.

Ver también

Referencias

  1. ^ "Interpretación eficiente transformando tipos de datos y patrones en funciones" (PDF) . Archivado desde el original (PDF) el 31 de marzo de 2010 . Consultado el 1 de marzo de 2009 .

enlaces externos