2012-04-07 12 views
2

Ich spiele gerade mit LISP herum. Alles ist in Ordnung, aber ich kann das folgende Problem nicht verstehen.Listenauswertung in LISP (merkwürdiges Verhalten der Nachteile)

habe ich die diese append-Betrieb:

(define (append l1 l2) 
    (if (eq? l1 null) 
     l2 
     (cons (first l1) 
      (myappend (rest l1) l2)))) 

ich es wie folgt verwendet werden:

(myappend (cons (cons 1 2) null) '(4 5)) 

Und das Ergebnis in Racket ist:

'((1 . 2) 4 5) 

Aber warum? Meiner Meinung nach sollte es '(1 2 4 5) sein, weil cons eine Liste zurückgibt und myappends zwei Listen anfügt. Kann mir jemand helfen? Was macht LISP?

+3

Sie scheinen einige Nicht-Standard-Funktionen eigentümlich Schläger werden. In Lisp (ANSI Common Lisp) werden Listen mit dem Symbol "nil" beendet. Im Standard-Schema (von dem Racket offensichtlich ein Dialekt ist) werden Listen nicht durch ein Symbol abgeschlossen. Sie werden durch ein leeres Listenobjekt beendet, das '()' geschrieben ist (und das bei Verwendung als Ausdruck zitiert werden muss: ''()'). Im Schema verwenden Sie '(null? X)', um zu testen, ob 'x' die leere Liste ist, nicht' (eq x null) '; Es gibt kein vordefiniertes "null". In Common Lisp ist es '(null x)' oder '(nicht x)' oder '(eq x nil)'. – Kaz

Antwort

11

cons gibt ein gepunktetes Paar zurück, nicht unbedingt eine Liste.

(cons 1 2) kehrt (1 . 2)

(cons 1 null) kehrt (1)

(cons 1 (cons 2 null)) kehrt (1 2)

+0

Ok, danke. Aber der Weg (cons 1 (cons 2 null)) kehrt nicht zurück (1. (2))? –

+4

@Thomas: Beide Ausdrücke repräsentieren die gleiche Struktur; Die Konvention besteht darin, wann immer möglich die Listennotation anstelle der Punktpaar-Notation zu bevorzugen. Wenn eine Cons-Zelle in der Struktur eine cdr hat, die ein Nicht-Null-Atom ist (wie in Ihrer Frage), wird die Notation mit punktierten Paaren benötigt, da die Struktur keine Liste ist. –

+0

@ThomasUhrig [Diese Antwort] (http://stackoverflow.com/a/16379759/1281433) (Disclaimer: Es ist von mir) hat mehr über die gedruckte Darstellung von cons Zellen. –

2

was (cons 1 2) kehrt Versuchen. Ist es eine Liste?

+0

Offensichtlich nicht. Ich glaube, ich habe etwas verpasst. Danke. –

4

Ein (cons 1 2) gibt ein Objekt zurück, dessen erster Zeiger (car) auf 1 zeigt, und der andere (cdr) auf 2, deshalb wird es in Punktpaarweise gedruckt.

Auch Sie möchten tiefer zu verstehen, werde ich Ihnen empfehlen, lesen Sie die CL: gentle introduction to symbolic computation, "6.4. Vergleichen CONS, LISTE UND APPEND", die diese Themen wirklich gut erklärt.

+0

schönes Buch, danke. –

1

zu @ThomasUhrig: die folgende Info könnte Ihnen helfen.

Obwohl wir über Lisp Sprache hier sprechen, merke ich, dass eine Linie von Seite 8 und 9 eines berühmten Buch namens "The Little Schemer (4th edition)" mir die 2 verwirrende Fakten ganz verstehen helfen:

Why (cons 1 2) does not look like '(1 2)? 
    Why (cons 1 '(2)) does  look like '(1 2)? 
    ---- 
    > (cons 1 2) 
    (1 . 2) 
    > (cons 1 '(2)) 
    (1 2) 
    > '(1 2) 
    (1 2) 

Nur lesen Sie die "Die Gesetze der Cons":

Die primitivecons benötigt 2 Argumente.

Das 2. Argument zu cons muss eine Liste sein.

Das Ergebnis ist eine Liste.

In der Praxis: (Nachteile AB) arbeitet für alle Werte A und B Und

(Auto (cons AB)) = A

(cdr (Nachteile A B)) = B

+1

Der Link zum PDF funktioniert nicht mehr. Ich kann immer noch leicht Kopien mit Google finden, aber es scheint immer noch an Orten zu verkaufen; Ich bin mir nicht sicher, ob es frei verteilt werden soll. Das heißt, das entsprechende „Gesetz der Cons“ ist in der Google Books [Vorschau] (http://books.google.com/books?id=xyO-KLexVnMC&lpg=PA9&dq=little%20schemer%20%22law%20of% 20cons% 22 & pg = PA9 # v = eine Seite & q = wenig% 20schemer% 20% 22law% 20von% 20cons% 22 & f = falsch). –