Frage

Ich bin von einem imperativ Hintergrund aber in diesen Tagen versuchen, meine Hände auf Lisp (Common Lisp)

Ich lese hier über cons dass

  

(cons x L):
  Bei einer LISP Objekt x und eine Liste L, Bewertung (cons x L) erstellt eine Liste enthält, die durch die Elemente in L gefolgt x.

Wenn ich absichtlich keine Liste als zweites Argument d.h verwendet habe, wenn ich verwende

(cons 'a 'a) erwartete ich einen Fehler, aber whoa! Ich habe (A . A).

Was habe ich verpasst und was (A . A)?

War es hilfreich?

Lösung

Cons konstruiert eine "cons Zelle". Das hat nichts mit Listen auf dem ersten zu tun. Eine cons Zelle ist ein Paar von zwei Werten. Eine cons Zelle wird in schriftlicher Form von einem „gepunkteten Paar“ dargestellt, z.B. (A . B), die die beiden Werte 'A und 'B hält.

Die beiden Plätze in einer cons Zelle „Auto“ und „cdr“ genannt. Sie können eine solche Nachteile Zelle als halbierten Block visualisieren:

  car   cdr
+-----+-----+
|  A  |  B  |
+-----+-----+

In Lisp kann ein Wert auch ein Hinweis auf etwas anderes sein, zum Beispiel eine andere Nachteile Zelle:

+-----+-----+       +-----+-----+
|  A  |   --------> |  B  |  C  |
+-----+-----+       +-----+-----+

Dies würde in „gepunktetes Paar“ Form als (A . (B . C)) dargestellt werden. Sie können so weitermachen:

+-----+-----+       +-----+-----+       +-----+-----+
|  A  |   --------> |  B  |   --------> |  C  |  D  |
+-----+-----+       +-----+-----+       +-----+-----+

Dies ist (A . (B . (C . D))). Wie Sie, in eine solche Struktur sehen kann, sind die Werte immer im car einer cons Zelle und die cdr Punkte an den Rest der Struktur. Eine Ausnahme ist der letzte Wert, der in dem letzten cdr ist. Wir brauchen diese Ausnahme nicht, aber: es einen besonderen Wert NIL in Lisp, das „Nichts“ bezeichnet. Indem NIL in die letzten cdr, haben Sie einen handlichen Sentinel-Wert und alle Ihre Werte sind in dem cars:

+-----+-----+       +-----+-----+       +-----+-----+       +-----+-----+
|  A  |   --------> |  B  |   --------> |  C  |   --------> |  D  | NIL |
+-----+-----+       +-----+-----+       +-----+-----+       +-----+-----+

Dies ist, wie eine Liste in Lisp aufgebaut ist. Da (A . (B . (C . (D . NIL)))) etwas unhandlich ist, kann es auch einfach als (A B C D) dargestellt werden. NIL wird auch die leere Liste () genannt; diese sind wechselbar Notationen für die gleiche Sache.

Jetzt können Sie sehen, warum (cons x list) eine weitere Liste zurückgibt. Cons einfach konstruiert andere Nachteile Zelle mit x im car und einem Verweis auf list im cdr:

+-----+-----+
|  X  |   --------> list
+-----+-----+

und wenn list (A B) ist, es funktioniert wie:

+-----+-----+       +-----+-----+       +-----+-----+
|  X  |   --------> |  A  |   --------> |  B  | NIL |
+-----+-----+       +-----+-----+       +-----+-----+

So, (cons x '(a b)) auswertet zu (x a b).

Listen sind nur eine sehr häufige Verwendung von cons Zellen. Sie können auch beliebige Bäume aus cons Zellen oder Kreislisten, oder jedes gerichteten Graphen konstruieren, eigentlich.

Andere Tipps

'a ist ein Lisp-Atom und (A . A) ist eine degenerierte Liste einer cons Zelle oder "genannt gepunktetes Paar“. Da Sie keine Liste für Argument L in (cons x L) bestanden haben bekommt man eine Zelle zurück.

(CONS x L)

Da x und L, CONS gibt eine neue cons Zelle mit x als CAR dieser Zelle und L als die CDR dieser Zelle.

sind Listen Ketten von cons Zellen verknüpft.

CL-USER 141 > (sdraw '(a b c))

[*|*]--->[*|*]--->[*|*]---> NIL
  |        |        |
  v        v        v
  A        B        C

CL-USER 142 > (sdraw (cons 'foo '(a b c)))

[*|*]--->[*|*]--->[*|*]--->[*|*]---> NIL
  |        |        |        |
  v        v        v        v
 FOO       A        B        C

Wenn CONS zwei Symbole als Argument bekommt sieht es wie folgt aus:

CL-USER 143 > (sdraw (cons 'foo 'bar))

[*|*]---> BAR
  |
  v
 FOO
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top