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.
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.
Quello che hai è un dotted list, che è una specie di improper list.
Una catena di celle CONS in cui l'ultimo CDR è NIL è un .
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.
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.
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.
Grazie. Nota interessante –