2010-03-04 12 views
7

so che in Lisp un elenco deve terminare con zero, ma l'espressione comeLista senza nulla in Lisp

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

non genera gli eventuali errori. Stampa:

(1 3 . 2) 

E 'corretto?

Sto usando GNU Clisp.

risposta

9

Quello che hai è un dotted list, che è una specie di improper list.

Una catena di celle CONS in cui l'ultimo CDR è NIL è un .

-1

Quando si itera su un elenco, si sa che si è raggiunta la fine quando si preme nil. Quello che hai è un elenco con una macchina e una coppia di punti.

11

In Lisp, un elenco corretta termina con NIL, ma si hanno anche impropri liste. Un tipo di elenco errato è un elenco in cui l'ultima cella contiene un atomo diverso da NIL nel suo CDR. (1 3 . 2) è esattamente un elenco errato.

Si può persino avere elenchi impropri in cui non è presente un'ultima cella. CAR s e CDR s sono fondamentalmente solo puntatori, quindi è possibile avere elenchi circolari!

In Common Lisp (che è la lingua utilizzata da CLISP), molte funzioni standard non funzionano con gli elenchi non validi come argomenti.

3

E 'anche interessante notare che cosa succede quando si valutano le liste corrette:

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

rispetto valutare liste tratteggiate:

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

ignora l'atomo di terminazione.

+0

Grazie. Nota interessante –