2010-03-04 22 views
7

sé que en Lisp una lista debe terminar con nula, pero la expresión comonula en Lisp

(print (cons 1 (cons 3 2))) 

no lanza ningún error. Imprime:

(1 3 . 2) 

¿Es correcto?

Estoy usando GNU Clisp.

Respuesta

9

Lo que tiene es dotted list, que es un tipo de improper list.

Una cadena de células CONS donde el último CDR es NIL es un .

-1

Cuando iteras sobre una lista, sabes que llegaste al final cuando llegas a cero. Lo que tienes es una lista con un auto y un par de puntos.

11

En Lisp, una lista adecuada termina con NIL, pero también tiene impropias listas. Un tipo de lista incorrecta es una lista donde la última celda cons tiene un átomo distinto de NIL en su CDR. (1 3 . 2) es exactamente una lista tan inapropiada.

Incluso puede tener listas incorrectas en las que no tiene una última celda. CAR sy CDR s son básicamente solo punteros, por lo que puede tener listas circulares!

En Common Lisp (que es el lenguaje CLISP implementa), muchas funciones estándar no funcionarán con listas incorrectas como argumentos.

3

También es interesante observar lo que sucede en la evaluación de las listas apropiadas:

;; A proper list 
(cons '+ (cons 5 (cons 10 '()))) 
⇒ (+ 5 10) 
(eval (+ 5 10)) 
⇒ 15 

frente a la evaluación de las listas de puntos:

;; A dotted list 
(cons '+ (cons 5 (cons 10 5000))) 
⇒ (+ 5 10 . 5000) 
(eval (+ 5 10 . 5000)) 
⇒ 15 

no tiene en cuenta el átomo de terminación.

+0

Gracias. Nota interesante –