2010-10-04 8 views
12

Gibt es Unterschiede zwischen dem, was in Common Lisp ein Atom heißt, und einem Symbol?Was ist der Unterschied zwischen einem Atom und einem Symbol in Common Lisp?

Erweitern sich diese Unterschiede zu anderen Sprachen in der Lisp-Familie?

(Ich bin mir bewusst, dass Atom eine andere Bedeutung in Clojure hat, aber ich bin interessiert an den Grenzen dessen, was ist ein Symbol.)

+0

Der Name "Atom" kommt vom griechischen "atomos" und bedeutet "unteilbar". Man ging also davon aus, dass Moleküle aus unteilbaren Teilchen zusammengesetzt sind, die als "Atome" bezeichnet werden, und alles, was in Lisp keine "Nachteile" ist, kann normalerweise nicht geteilt werden. – erjiang

Antwort

11

In Common Lisp, Atom genau wie jedes Objekt definiert ist Das ist kein Betrug. Weitere Details finden Sie unter http://l1sp.org/cl/atom.

Ich weiß nicht über andere Sprachen in der Lisp-Familie.

1

In Schema ein Atom ist etwas, das kein Paar ist:

> (pair? 1) 
#f 
> (pair? '(1 2 3)) 
#t 
> (pair? 'a) 
#f 

So Symbole Atome sind, wie Zahlen und Strings. Atom hat eine ähnliche Definition in Common Lisp, wobei die Funktion (atom object) als (not (consp object)) definiert ist.

+0

Dies ist nur eine der möglichen Definitionen eines "Atoms" in Schema. –

0

In Common Lisp ähnelt ein Symbol in anderen Sprachen sehr stark einer Variablen, obwohl es schwerer ist (es ist nicht nur ein leeres Stück Speicher, das groß genug ist, um einen Wert zu speichern). Es ist normalerweise intern ed, so dass es durch den Namen referenziert werden kann, obwohl es möglich ist, anonyme Symbole zu haben (ähnlich wie Speicher in C, auf den Sie nur mit Zeiger verweisen könnten).

Ein Atom ist ein Wert, der keine Zelle cons ist. Ein Symbol ist ein Atom, und ebenso eine Zahl, eine Zeichenkette und viele andere Dinge. Die häufigste Verwendung von Zellen cons besteht darin, Listen zu erstellen, obwohl es möglich ist, sie auf andere Arten zu verwenden.

+1

ein Symbol ist nicht wie eine Variable in anderen Sprachen. Ein Symbol ist ein "Objekt" mit einem Namen. Im Quellcode schreiben wir Variablen mit Symbolen, aber das macht ein Symbol nicht notwendigerweise zu einer Variablen. (defun foo (bar) bar) <- hier ist BAR ein Symbol im Quelltext, aber das Symbol ist nicht die Variable in einer kompilierten Funktion FOO. –

+0

@Rainer: Leider kenne ich keine gute Möglichkeit, ein CL-Zeichen sofort verständlich zu beschreiben. Es ist nicht nur ein Objekt mit einem Namen. Es muss nicht einmal einen Namen haben (think '(gensym)'), und es ist eine ziemlich seltsame Art von Objekt. –

+0

Sicher hat es einen Namen: (Symbol-Name (Gensym)) -> "G1620994". Es ist nur ein berechneter Name. Ein Symbol ist ein Objekt, das einen Namen hat, nach Namen gesucht werden kann, wenn es in einem Paket interniert ist und verwendet werden kann, um auf einen Wert, eine Funktion, sein Paket, seinen Namen und eine Eigenschaftsliste zu verweisen. –

4

"Atom" wird normalerweise von der Listenverarbeitung gesehen. In Common Lisp ist etwas entweder eine nicht leere Liste oder ein Atom. Früher wurde ein Atom auch "Atomsymbol" genannt, was etwas anders ist. Nun sind in Common Lisp-Atomen nicht nur Symbole, sondern alles andere, was keine Cons-Zelle ist (Beispiele: Strings, Zahlen, Hashtables, Streams, ...).

Wenn etwas kein Atom ist (ist ein Nachteil), können die Operationen CAR, CDR, FIRST und REST verwendet werden.

Also Atom ist eine Gruppe von Datenstruktur. Ein Symbol ist eine bestimmte Datenstruktur, die zufällig auch ein Atom ist.