Verwenden Sie CLOS. Es ist nicht kompliziert.
Andernfalls verwenden Sie Strukturen.
Wenn Sie eine spezielle Frage zur Verwendung haben, fragen Sie einfach.
(defclass point ()
((x :type number)
(y :type number)))
(defclass rectangle ()
((p1 :type point)
(p2 :type point)
(color :type color)))
Solche Dinge führen schließlich zu Schnittstellen wie Rechtecke in CLIM (der Common Lisp Interface Manager).
Geschichte
Um es noch ein wenig zu erweitern: Historisch gesehen wurden "Strukturen" in einigen Situationen auf niedriger Ebene verwendet. Strukturen haben Einzelvererbung und der Zugriff auf Slots ist "schnell". Einige Lisp-Dialekte haben mehr als das, was Common Lisp bietet. Ab Mitte der 70er Jahre wurden dann verschiedene Formen von objektorientierten Darstellungen für Lisp entwickelt. Die meisten Darstellungen von strukturierten Objekten gingen von Strukturen zu einer Art objektorientierter Lisp-Erweiterung über. Beliebt in den 80er Jahren waren klassenbasierte Systeme wie Flavors, LOOPS und andere. Auch Frame- oder Prototyp-basierte Systeme wie KEE Units oder Object Lisp waren beliebt. Das erste Macintosh Common Lisp verwendete Object Lisp für alle seine UI- und IO-Funktionen. Die MIT-Lisp-Maschine verwendete Flavors praktisch überall. Ab Mitte der 80er Jahre wurde ANSI CL entwickelt. Ein gemeinsames OO-System wurde speziell für Common Lisp entwickelt: CLOS. Es basierte auf Flavors und Loops. Während dieser Zeit wurde fast nichts getan, um Strukturen wirklich zu verbessern - abgesehen davon, dass Implementierer Wege fanden, die Implementierung zu verbessern und eine oberflächliche CLOS-Integration bereitzustellen. Zum Beispiel bieten Strukturen keine Möglichkeit, Daten zu packen. Wenn zwei Slots mit 4 Bit Inhalt vorhanden sind, gibt es keine Möglichkeit, Common Lisp anzuweisen, beide Slots in eine einzige 8-Bit-Speicherregion zu kodieren.
Als Beispiel können Sie in der Lisp Machine Manual, Kapitel über Strukturen (PDF) dass es viel komplexere Strukturen hatte als Common Lisp. Einiges davon war bereits in Maclisp in den 70er Jahren vorhanden: DEFSTRUCT im Maclisp-Handbuch .
CLOS, das Common Lisp Object System
Die meisten Menschen würden zustimmen, dass CLOS ein schönes Design ist. Manchmal führt es zu "größerem" Code, vor allem weil Bezeichner lang werden können. Aber es gibt auch CLOS-Code, wie den im AMOP-Buch, der wirklich schön geschrieben ist und zeigt, wie er verwendet werden soll.
Im Laufe der Zeit mussten sich die Implementierer mit der Herausforderung auseinandersetzen, dass die Entwickler CLOS verwenden wollten, aber auch die "Geschwindigkeit" von Strukturen haben wollten. Dies ist mit dem "vollständigen" CLOS, das das fast standardmäßige Meta Object Protocol (MOP) für CLOS enthält, noch schwieriger. Es gibt also einige Tricks, die Implementierer anbieten. In den 80er Jahren verwendete einige Software einen Schalter, so dass sie entweder mit Strukturen oder mit CLOS - CLX - kompiliert werden konnte (die Low-Level Common Lisp X11-Schnittstelle war ein Beispiel dafür). Der Grund: Auf einigen Computern und Implementierungen war CLOS viel langsamer als Strukturen. Heute wäre es unüblich, einen solchen Kompilierschalter vorzusehen.
Wenn ich mir heute eine gute Common Lisp-Implementierung ansehe, würde ich erwarten, dass sie fast überall CLOS verwendet. STREAMs sind CLOS-Klassen. CONDITIONs sind CLOS-Klassen. Das GUI-Toolkit verwendet CLOS-Klassen. Der Editor verwendet CLOS. Es könnten sogar fremde Klassen (z.B. Objective C-Klassen) in CLOS integriert werden.
In jeder Common Lisp-Implementierung, die kein Spielzeug ist, wird CLOS das Werkzeug sein, um strukturierte Daten, generisches Verhalten und eine Reihe anderer Dinge bereitzustellen.
Wie in einigen der anderen Antworten erwähnt, ist CLOS an manchen Orten möglicherweise nicht erforderlich.
Common Lisp kann mehr als einen Wert aus einer Funktion zurückgeben:
(defun calculate-coordinates (ship)
(move-forward ship)
(values (ship-x ship)
(ship-y ship)))
Man kann Daten in Verschlüssen speichern:
(defun create-distance-function (ship x y)
(lambda ()
(point-distance (ship-x ship) (ship-y ship) x y)))
Zur Konfiguration kann man eine Art von Listen verwenden:
(defship ms-germany :initial-x 0 :initial-y 0)
Sie können darauf wetten, dass ich das Schiffsmodell in CLOS implementieren würde.
Eine Lehre aus dem Schreiben und Warten von CLOS-Software ist, dass sie sorgfältig entworfen werden muss. CLOS ist so leistungsfähig, dass man damit wirklich komplexe Software erstellen kann - eine Komplexität, die oft keine gute Idee ist. Refaktorieren und vereinfachen! Glücklicherweise sind für viele Aufgaben die grundlegenden CLOS-Funktionen ausreichend: DEFCLASS, DEFMETHOD und MAKE-INSTANCE.
Hinweise zu CLOS-Einführungen
Zunächst einmal hat Richard P. Gabriel seine CLOS-Papiere zum Herunterladen.
Siehe auch: