Pregunta

Soy de un fondo imprescindible pero estos días tratando mis manos en LISP (Common Lisp)

aquí sobre cons que

  

(cons x L):
  Dado un objeto LISP x y una lista L, la evaluación de (cons x L) crea una lista que contiene x seguido de los elementos en L.

Cuando intencionadamente no hizo uso de una lista como el segundo argumento es decir cuando utilicé

(cons 'a 'a) esperaba un error, pero Whoa! Tengo (A . A).

¿Qué me he perdido y lo que es (A . A)?

¿Fue útil?

Solución

Cons construye una "célula contras". Esto no tiene nada que ver con listas en un principio. Una célula contras es un par de dos valores. Una célula contras está representado en forma escrita por un "par de puntos", por ejemplo, (A . B), que sostiene los dos valores 'A y 'B.

Los dos lugares en una célula contras son llamados "coche" y "CDR". Se puede visualizar como una cons celular como un bloque dividida en dos partes:

  car   cdr
+-----+-----+
|  A  |  B  |
+-----+-----+

En Lisp, un valor también puede ser una referencia a otra cosa, por ejemplo, otra célula contras:

+-----+-----+       +-----+-----+
|  A  |   --------> |  B  |  C  |
+-----+-----+       +-----+-----+

Esto estaría representado en forma de "par de puntos", como (A . (B . C)). Puede continuar de esta manera:

+-----+-----+       +-----+-----+       +-----+-----+
|  A  |   --------> |  B  |   --------> |  C  |  D  |
+-----+-----+       +-----+-----+       +-----+-----+

Este es (A . (B . (C . D))). Como se puede ver, en la estructura de este tipo a, los valores son siempre en el car de una célula contras, y los puntos cdr al resto de la estructura. Una excepción es el último valor, que está en la última cdr. No necesitamos esta excepción, sin embargo: hay un valor especial NIL en Lisp, que denota "nada". Al poner NIL en el último cdr, tiene un valor centinela a mano, y todos sus valores están en el cars:

+-----+-----+       +-----+-----+       +-----+-----+       +-----+-----+
|  A  |   --------> |  B  |   --------> |  C  |   --------> |  D  | NIL |
+-----+-----+       +-----+-----+       +-----+-----+       +-----+-----+

Así es como se construye una lista en Lisp. Desde (A . (B . (C . (D . NIL)))) es un poco difícil de manejar, sino que también puede representarse simplemente como (A B C D). NIL también se llama la lista () vacío; estos son intercambiables notaciones para la misma cosa.

Ahora usted puede ver por qué (cons x list) vuelve otra lista. Cons simplemente construye otra célula contras con x en el car y una referencia a list en el cdr:

+-----+-----+
|  X  |   --------> list
+-----+-----+

y si es list (A B), funciona como:

+-----+-----+       +-----+-----+       +-----+-----+
|  X  |   --------> |  A  |   --------> |  B  | NIL |
+-----+-----+       +-----+-----+       +-----+-----+

Así, evalúa (cons x '(a b)) a (x a b).

Las listas son de un solo uso muy común de cons cells. También puede construir árboles arbitrarias a partir de células Contras, o listas circulares, o cualquier gráfico dirigido, en realidad.

Otros consejos

'a es un átomo de Lisp y (A . A) es una lista degenerado llamado contras celular o " par de puntos". Ya que no pasó una lista de argumentos L en (cons x L) que volvió una célula.

(CONS x L)

x y L dado, CONS devuelve una nueva célula contras con x como el coche de esa célula y L como la CDR de esa célula.

Las listas se cadenas de células Contras vinculados.

CL-USER 141 > (sdraw '(a b c))

[*|*]--->[*|*]--->[*|*]---> NIL
  |        |        |
  v        v        v
  A        B        C

CL-USER 142 > (sdraw (cons 'foo '(a b c)))

[*|*]--->[*|*]--->[*|*]--->[*|*]---> NIL
  |        |        |        |
  v        v        v        v
 FOO       A        B        C

Si CONS recibe dos símbolos como un argumento que tiene este aspecto:

CL-USER 143 > (sdraw (cons 'foo 'bar))

[*|*]---> BAR
  |
  v
 FOO
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top