2010-09-08 9 views

Antwort

19

Atome in Clojure und Atome in Common Lisp (und die meisten anderen Lisps) sind zwei völlig unabhängige Konzepte. Sie haben nichts miteinander zu tun, außer den gleichen Namen zu haben.

Es gibt keinen "Unterschied". Es würde fragen, was ist der Unterschied zwischen einem Fenster in einem Haus und einem Fenster auf Ihrem Computerbildschirm? Es macht keinen Sinn, Unterschiede zu identifizieren, da die beiden Konzepte nicht verwandt sind.

'Atome' in Clojure verwalten Zustand.

'Atome' in Lisp ist ein Wort für alle Datentypen, die keine Cons-Zellen sind (wie Zahlen, Zeichen, Strings, Symbole, ...).

In Lisp ist die Funktion ATOM einfach wie folgt definiert:

(defun atom (object) 
    (not (consp object))) 

Da Clojure keine Nachteile Zellen hat und keine Funktion consp, ist es nicht möglich (not (consp object)) zu sagen. Daher existiert in Clojure kein Lisp-Konzept wie "atom". Beachten Sie, dass Clojure eine Funktion cons hat, aber es erstellt keine Cons-Zellen wie in Lisp.

+6

Es ist erwähnenswert, dass Clojure immer noch Lisp-Atome in Symbolen, Schlüsselwörtern, Zahlen, Strings usw. hat, aber es ist einfach nicht Teil des Clojure-Vokabulars. –

+1

@John Cromartie: Das kann nicht wirklich sein. Clojure hat keine Cons-Zellen. In Lisp Atom ist definiert als "nicht Nachteile". Da clojure keine Cons-Zellen hat, ist das Konzept eines Lisp-Atoms in Clojure nicht definiert. Beachten Sie, dass Clojure eine Cons-Operation hat, aber keine Cons-Zellen erstellt. –

2

Sie sind weitgehend verschieden und haben eine gemeinsame konzeptionelle Grundlage für die Verwendung des Namens ‚Atom‘

  • Atom in Common Lisp bezieht sich auf die Idee der eine indivisable Sache wie die ursprüngliche Bedeutung eines Atoms Angelegenheit.

  • Atom in clojure bezieht sich auf eine spezifische änderbare Datenstruktur, die changes ‚atomar‘, die ein Schreiben auf sie entweder abgeschlossen oder nicht (und in der Folge wiederholt wird)

die gemeinsame Idee ist das unteilbare Konzept. In CL ist es das, was das Ding ist und in Clojure, wie sich das Ding verändert.

In Clojure Atome werden verwendet, wenn Sie mutierbare Daten blockieren müssen, die nicht koordiniert sind. zum Beispiel ein einzelner userId Zähler oder etwas. Clojure hat auch einen veränderbaren Zugriff in Refs (denke Bankkontoverträge) und atomare unkoordinierte nicht-blockierende veränderbare Dinge in Agents (think log collectors zum Beispiel) koordiniert.

+0

Common Lisp hat keine Ahnung von "unteilbaren" Dingen. Ein Nachteil ist wie ein Datensatz mit zwei Slots - wie ein Vektor mit zwei Vektoren. Das Konzept eines ATOM ist so definiert, dass es nichts anderes als eine Cons-Zelle ist. Aber die Cons-Zelle als Datenstruktur ist nichts besonderes (im Gegensatz zu Arrays, Vektoren, Strings, Strukturen, CLOS-Objekten, ...), sie ist nur in Lisp besonders, weil sie weit verbreitet ist. –

0

In allen Lisps Atome sind symbolischen Ausdrücken dass sind keine Listen (außer leere Listen). Sie werden auch atomare S-Ausdrücke genannt. Was ist atomar (unteilbar) drin? Historisch gesehen waren die Listen etwas, das in kleinere Teile unterteilt werden konnte, in denen Atome (aber nicht nicht leere Listen) nicht enthalten waren.In Clojure gibt es auch atomare S-Ausdrücke, aber es gibt auch eine Datenstruktur namens Atom, die es ermöglicht, veränderbare Datenobjekte zu erstellen, auf die mehrere Threads zugreifen können. Was ist Atom in ihnen? Die Operation.

Wenn Sie ein Atom ändern, wird sein Zustand erfolgreich geändert oder nicht. Es wird keine Situation geben, in der sich die Hälfte (z. B. irgendein Vektor) ändert und eine Hälfte nicht. Wenn die Operation nicht erfolgreich ist, wird sie erneut versucht, und ein aktueller Thread wartet, bis er abgeschlossen ist.

Was ist der Unterschied zwischen den Atomen von Lisp und den Clojure-Atomen? Das Abstraktionsniveau. Lisp-Atome sind eine Klasse von symbolischen Ausdrücken, während Clojure-Atome eine Klasse von Datenstrukturen sind, die verwendet werden, um geteilte Daten zu behandeln.

+1

Das ist einfach falsch. Ein Symbol ist ein Atom, aber es bewertet sich nicht selbst. In älteren Lisps haben sich viele andere Dinge nicht selbst bewertet. Bewertung für sie war ein Fehler. Ein Atom zu sein und Bewertung ist nicht verwandt. "Atom" bedeutet meistens: alles was keine nicht leere Liste ist. Alles, was keine Cons-Zelle ist, ist ein Atom. –

+0

Danke für die Korrektur. Ich war auf Schlüsselwörter fixiert, wenn ich über Atome nachdachte. Falsche Aussage zur Selbsteinschätzung entfernt – siefca

Verwandte Themen