Pregunta

¿Cuál es la diferencia entre:

(cons 'a (cons 'b 'c)) ;; (A B . C)

y

(cons 'a '(b.c)) ;; (A B.C)

Es necesario crear la siguiente lista ((a.b) .c) usando los contras, así que estoy tratando de entender lo que "" representa.

L.E . Tengo el siguiente (cons (cons 'a 'b) 'c) pero produce ((A . B) . C) y no ((A.B).C) (Tenga en cuenta los espacios adicionales)

¿Fue útil?

Solución

Los espacios se utilizan para los tokens catálogo por separado. A.B es un solo token. (A.B) es una lista con un solo elemento. (A . B) es una célula contras con A como coche y B como CDR.

Una célula contras es un par de "cosas" (objetos). En su caso, estas cosas son símbolos, y se nombran A, B, etc .. La representación impresa de dicha célula es (A . B), por ejemplo. Esto se llama "notación de puntos". El primer elemento se llama "coche", el segundo "CDR".

El cons función crea una célula de este tipo. así (cons 'a 'b) produce la (A . B) celular. Nota que los nombres son siempre upcased internamente .

Esto es más probable lo que su maestro quería, por lo ((A . B) . C) es la salida correcta, y el código de la respuesta correcta. Se trata de una celda en la que el coche apunta a otra celda, y el cdr contiene C. Esa otra célula es una célula donde el coche contiene A y la B CDR.

Por cierto, una lista es una cadena lineal de tales células contras, de modo que el coche tiene siempre un valor y los puntos de CDR para el resto de la lista. Los puntos último IEC ninguna parte (que se llama NIL en Lisp). En la notación de puntos, una lista es, por ejemplo, (A . (B . (C . NIL))). Ya que las listas son importantes, pueden ser escritos más corta de esta manera: (A B C). Si el último CDR tiene un valor en lugar de NIL, se muestra en la notación de puntos, por ejemplo, (A . (B . (C . D)))) se puede escribir como (A B C . D).

Otros consejos

. entre dos caracteres es una parte de un símbolo. b.c es un símbolo con un nombre de tres personajes:.. b , y c

Si introduce FOO.BAR, a continuación, Lisp lo leerá como un símbolo.

Si introduce (FOO.BAR) continuación Lisp lo leerá como una lista con un símbolo como su contenido.

Si introduce (FOO . BAR) continuación Lisp lo leerá como una célula contras con FOO como el CAR y BAR como el CDR .

. se utiliza para separar el CAR y CDR de una célula contras: (a . b). Tenga en cuenta el espacio alrededor ..

(cons 'b 'c) crea una célula contras con el b símbolo que el CAR y el símbolo c como el CDR . Se escribe como (b . c).

(cons 'a '(b.c)) crea una lista de dos símbolos, y a b.c. Se escribe como (a b.c).

((A.B).C) siempre se imprime como ((A.B) . C). Tampoco es una lista.

((a.b) . c) es una célula contras con el (a.b) lista como el CAR y el símbolo c como el CDR .

Si esto es en el curso de aprendizaje de Lisp, la cuestión Probablemente no se entiende un implícito "ningún espacio permitido" regla, ya que los espacios no son significativas contra el paréntesis, y la respuesta correcta es la que le diste.

En particular, siempre se agrega el espacio después de un paréntesis de cierre, pero es para el propósito de la legibilidad humana única. No tiene ningún sentido exigir que no se va a imprimir.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top