2010-03-04 10 views
7

Ich weiß, dass in Lisp eine Liste mit Null enden muss, sondern Ausdruck wieListe ohne nil in Lisp

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

keine Fehler werfen. Es druckt:

(1 3 . 2) 

Ist es richtig?

Ich benutze GNU Clisp.

Antwort

9

Was Sie haben, ist eine dotted list, die eine Art improper list ist.

Eine Kette von CONS-Zellen, bei denen die letzte CDR NIL ist, ist .

-1

Wenn Sie über eine Liste iterieren, wissen Sie, dass Sie das Ende erreicht haben, wenn Sie die Taste nil drücken. Was Sie haben, ist eine Liste mit einem Auto und einem Punktpaar.

11

In Lisp, eine richtigen Liste endet mit NIL, aber Sie haben auch falsche Listen. Eine Art falscher Liste ist eine Liste, in der die letzte Cons-Zelle ein anderes Atom als NIL in ihrer CDR hat. (1 3 . 2) ist genau so eine falsche Liste.

Sie können sogar falsche Listen haben, in denen es keine letzte Zelle hat. CAR s und CDR s sind im Grunde nur Zeiger, so können Sie zirkuläre Listen haben!

In Common Lisp (die die Sprache CLISP implementiert) funktionieren viele Standardfunktionen nicht mit falschen Listen als Argumente.

3

Es ist auch interessant zu sehen, was passiert, wenn die richtigen Listen Auswertung:

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

gegen gepunktete Listen Auswertung:

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

Sie ignoriert den Abschluss Atom.

+0

Danke. Interessante Notiz. –

Verwandte Themen