2015-12-12 13 views
5

Mein Verständnis einer Struktur ist, dass es Steckplätze zum Speichern von Daten hat, hat einen Typ, make-X und Slot-Accessor-Funktionen, und kann durch eine Methode spezialisiert werden (da es eine Art).Unterschied zwischen Struktur und Klasse in Common Lisp

Mein Verständnis einer Klasse ist, dass es die gleiche und mehrfache Vererbung hat. Die oberste Antwort auf this question besagt, dass Strukturen einzelne Vererbung haben können, und dass Anfangsimplementierungen von CLOS "viel langsamer" als Strukturen waren.

Basierend auf wie Leute über CLOS und Strukturen sprechen, nehme ich an, dass es einige andere Unterschiede geben muss, aber meine trivialen Google-Suchen waren fruchtlos. Also frage ich: Was sind die praktischen Unterschiede zwischen CLOS und Strukturen?

Antwort

9

Structures

Structures sind primitiv. Sie bieten, was oft ein Datensatz in Programmiersprachen genannt wird. Sie wurden vor dem Unterricht erfunden. CLtL1 (das erste Buch, das Common Lisp beschreibt) hatte 1984 bereits Strukturen und später wurde ein Standard-Objektsystem namens CLOS hinzugefügt.Strukturen bieten

  • eine kurze Definition Makro DEFSTRUCT
  • Einfachvererbung
  • schnellen Schlitzzugriffs
  • definiert Leser und setf Zugang für Schlitze
  • ein Prädikat Typ definiert
  • einen Konstruktor Funktion definiert
  • definiert eine Kopierfunktion
  • eine gedruckte Darstellung: Strukturen können
  • obigen Funktionen vielleicht
  • inlined

nützliche Zusätze gelesen und ausgedruckt werden:

  • DEFSTRUCT definieren Listen- und vektorbasierte Darstellungen von Strukturen, zusätzlich zu Struktur
  • Typen

Einschränkungen:

  • nach einer Änderung an einem Strukturtyp werden Strukturinstanzen nicht aktualisiert
  • Wenn ein Strukturtyp geändert wird, empfiehlt es sich, geänderten Code neu zu kompilieren und erneut auszuführen. Vielleicht starte das Programm neu. Die Auswirkungen der Neudefinition einer Struktur sind im standardmäßigen Common Lisp nicht definiert.
  • sehr wenig Introspektion: Portable Common Lisp sagt mir nicht super/Substrukturen einer Struktur auf einfache Weise. Portable Common Lisp sagt mir nicht die Slots einer Struktur.
  • kein Slot Zugriff über Slot-Namen standardmäßig

Extensions

  • einige Implementierungen bieten mehr Laufzeit Selbstbeobachtung und ein wenig Integration in einigen CLOS Funktionen

CLOS Klassen

CLOS wurde Mitte/Ende der 80er Jahre basierend auf zwei früheren Objektsystemen (Flavours und LOOPS) erfunden. Es sieht vor:

  • eine bestimmendes Makro DEFCLASS
  • Mehrfachvererbung
  • Protokolle für die Erstellung, Initialisierung, usw.
  • CLOS Objekte geändert werden können und zur Laufzeit basierend auf Klassenänderungen (neue Slots aktualisiert, neu definiert Slots, entfernte Slots, geänderte Vererbung, ...)
  • CLOS Objekte können ihre Klasse ändern und
  • Zugriff über Slot-Namen möglich

Einschränkungen zur Laufzeit aktualisiert werden:

  • kein Standarddrucker/Leser
  • DEFCLASS Definitionen sind nicht sehr prägnant

extensions

  • schneller Slot Zugriff hinzugefügt Implementierung spezifische Funktionalität
  • Meta-Object-Protokoll bietet zusätzliche Funktionalität und Flexibilität: Selbstbeobachtung und Reflexion. Manchmal werden nur Teile des MOP bereitgestellt.
  • Benutzer bereitgestellte Erweiterungen zur Verfügung, insbesondere für Implementierungen mit MOP Unterstützung

Common Lisp

In einigen Fällen sind die Common Lisp Standard sagt nicht, wie eine Funktionalität implementiert werden soll: Strukturen, Klassen oder vielleicht noch etwas anderes. Beispiele sind Ströme und Bedingungen. Es ist normalerweise ein gutes Zeichen (für zusätzliche Flexibilität), wenn eine Common-Lisp-Implementierung CLOS für diese verwendet.

+0

Aus Neugier, wie überprüft man, ob eine Implementierung CLOS für (zum Beispiel) Streams verwendet? – Reepca

+0

@Reepca: Wenn ein Typ ein Subtyp von 'Standard-Objekt' ist, dann ist es eine CLOS-Klasse. Für eine Konditionsart: '(Subtyp 'Fehler' Standard-Objekt)' -> T oder NIL. Einige Implementierungen können zum Beispiel verschiedene CLOS- und Nicht-CLOS-Typen von Strömen erlauben. –

+0

Könnten Sie näher erläutern, wie sich das Ändern von Klassen zur Laufzeit eignet? Ich kann nicht an andere Sprachen denken, die das wirklich haben, also habe ich nie in diesen Begriffen gedacht. – MasterMastic

1

defstruct macht mehr Arbeit für Sie hinter den Kulissen, zum Beispiel:

  1. Schlitz definiert Accessoren automatisch
  2. print-object Methode

auch lesbar definiert, Struktur Slot Zugriff ist schneller (obwohl der Unterschied ist wahrscheinlich inkonsequent).

Die Quintessenz ist, dass, wenn Sie MOPish Funktionen benötigen, Sie mit defsrtuct kommen können.