Frage

Was ist der Unterschied zwischen:

(cons 'a (cons 'b 'c)) ;; (A B . C)

und

(cons 'a '(b.c)) ;; (A B.C)

Ich brauche die folgende Liste ((a.b) .c) unter Verwendung Nachteile zu schaffen, so dass ich zu verstehen, was ich versucht, das „“ darstellt.

L.E :. Ich habe folgendes (cons (cons 'a 'b) 'c) aber es produziert ((A . B) . C) und ((A.B).C) nicht (Beachten Sie die zusätzlichen Leerzeichen)

War es hilfreich?

Lösung

Die Räume sind auf separate Liste Token verwendet. A.B ist ein einziges Token. (A.B) ist eine Liste mit einem einzigen Element. (A . B) ist eine cons Zelle mit A wie Auto und B als cdr.

Eine cons Zelle ist ein Paar von „Dingen“ (Objekte). In Ihrem Fall diese Dinge Symbole sind, und sie sind A genannt, B, etc .. Die gedruckte Darstellung einer solchen Zelle ist (A . B), zum Beispiel. Dies wird als „Punktnotation“ genannt. Das erste Element ist "Auto" genannt, das zweite "cdr".

Die Funktion cons schafft eine solche Zelle. (cons 'a 'b) somit erzeugt die Zelle (A . B). Beachten Sie, dass Namen werden immer intern upcased .

Dies ist höchstwahrscheinlich, was Ihr Lehrer wollte, so ((A . B) . C) ist die korrekte Ausgabe, und Ihr Code die richtige Antwort. Dies ist eine Zelle, in dem das Auto in einer anderen Zelle verweist, und die cdr enthält C. Die andere Zelle ist eine Zelle, wo das Auto A und die cdr B enthält.

Durch die Art und Weise, eine Liste ist eine lineare Kette solcher Nachteile Zellen, so dass das Auto hält immer einen Wert und die cdr zeigt auf den Rest der Liste. Die letzten cdr Punkte nirgends (die NIL in Lisp genannt). In Punkt-Notation, ist eine Liste z.B. (A . (B . (C . NIL))). Da Listen wichtig sind, können sie kürzer wie folgt geschrieben werden: (A B C). Wenn der letzte Wert CDR anstelle von NIL hat, wird sie in Punktschreibweise gezeigt, z.B. (A . (B . (C . D)))) kann als (A B C . D) geschrieben werden.

Andere Tipps

. zwischen zwei Zeichen ist ein Teil eines Symbols. b.c ist ein Symbol mit einem Namen von drei Zeichen:.. b und c

Wenn Sie FOO.BAR eingeben, dann Lisp wird es als ein Symbol lesen.

Wenn Sie (FOO.BAR) geben Sie es als eine Liste Lisp als seinen Inhalt mit einem Symbol lesen.

Wenn Sie (FOO . BAR) geben Sie Lisp wird es als cons Zelle mit FOO als die CAR und BAR als die CDR lesen.

. wird verwendet, um die CAR und CDR eine cons Zelle zu trennen: (a . b). Notieren Sie sich den Raum um ..

(cons 'b 'c) schafft eine cons Zelle mit dem Symbol b als die CAR und das Symbol c als CDR . Es steht geschrieben, wie (b . c).

(cons 'a '(b.c)) erstellt eine Liste von zwei Symbolen, a und b.c. Es steht geschrieben, wie (a b.c).

((A.B).C) wird immer als ((A.B) . C) gedruckt. Es ist auch keine Liste.

((a.b) . c) ist eine cons Zelle mit der Liste (a.b) als die CAR und das Symbol c als die CDR .

Wenn dies in dem Kurs ist Lisp zu lernen, ist die Frage wohl einen impliziten „keinen Platz gelassen“ -Regel nicht gemeint, als Räume gegen Klammer nicht signifikant sind, und die richtige Antwort ist, die Sie gab.

Insbesondere der Raum nach einer schließenden Klammer wird immer hinzugefügt, aber es ist für die menschliche Lesbarkeit Zweck. Es macht keinen Sinn machen, erfordert es nicht gedruckt werden.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top