Allgemeines Lispeln-Gegenstand-System

Common Lisp Object System (CLOS) ist die Möglichkeit für die objektorientierte Programmierung, die ein Teil des ANSI Allgemeinen Lispelns ist. CLOS ist ein starkes dynamisches Gegenstand-System, das sich radikal von den OOP Möglichkeiten unterscheidet, die auf mehr statischen Sprachen wie C ++ oder Java gefunden sind. CLOS wurde durch frühere Lispeln-Gegenstand-Systeme wie MIT-Geschmäcke und CommonLOOPS begeistert, obwohl es allgemeiner ist als auch. Ursprünglich vorgeschlagen als eine Erweiterung wurde CLOS als ein Teil des ANSI Standards für das Allgemeine Lispeln angenommen und ist in die anderen Lispeln-Dialekte wie EuLisp oder Emacs-Lispeln angepasst worden.

Eigenschaften

Die grundlegenden Bausteine von CLOS sind Klassen, Beispiele von Klassen, allgemeinen Funktionen und ihren Methoden. CLOS stellt Makros zur Verfügung, um diejenigen zu definieren: und. Beispiele werden mit der Funktion geschaffen.

Klassen können vielfache Superklassen, eine Liste von Ablagefächern (Mitglied-Variablen in C ++/Java Sprachgebrauch) und eine spezielle meta Klasse haben. Ablagefächer können durch die Klasse zugeteilt werden (alle Beispiele einer Klasse teilen das Ablagefach), oder durch das Beispiel. Jedes Ablagefach hat einen Namen, und auf den Wert eines Ablagefaches kann durch diesen Namen mit der Funktion zugegriffen werden. Zusätzlich spezielle allgemeine Funktionen können definiert werden, um Werte von Ablagefächern zu schreiben oder zu lesen. Jedes Ablagefach in einer CLOS Klasse muss einen einzigartigen Namen haben.

CLOS ist ein vielfaches Absendungssystem. Das bedeutet, dass Methoden auf irgendwelchen oder alle ihre erforderlichen Argumente spezialisiert werden können. Die meisten OO Sprachen sind einzelne Absendung, bedeutend, dass Methoden nur auf dem ersten Argument spezialisiert werden. Eine andere ungewöhnliche Eigenschaft ist, dass Methoden Klassen nicht "gehören"; Klassen stellen keinen namespace für allgemeine Funktionen oder Methoden zur Verfügung. Methoden werden getrennt von Klassen definiert, und sie haben keinen speziellen Zugang (z.B das, selbst, oder geschützt) zu Klassenablagefächern.

Methoden in CLOS werden in allgemeine Funktionen gruppiert. Eine allgemeine Funktion ist ein Gegenstand, der wie eine Funktion kündbar ist, und der eine Sammlung von Methoden mit einem geteilten Namen und Argument-Struktur, jeder vereinigt, der für verschiedene Argumente spezialisiert ist. Da Allgemeines Lispeln non-CLOS Klassen für Strukturen und eingebaute Datentypen (Zahlen, Schnuren, Charaktere, Symbole...), CLOS Absendungsarbeiten auch mit diesen non-CLOS Klassen zur Verfügung stellt. CLOS unterstützt auch Absendung über individuelle Gegenstände (eql specializers). CLOS tut nicht durch die Verzug-Unterstützungsabsendung über alle Allgemeinen Lispeln-Datentypen (zum Beispiel Absendung arbeitet für völlig spezialisierte Reihe-Typen oder für Typen nicht, die durch eingeführt sind). Jedoch stellen Allgemeinste Lispeln-Durchführungen ein metaobject Protokoll zur Verfügung, das allgemeinen Funktionen erlaubt, Anwendung spezifische Spezialisierung und Absendungsregeln zur Verfügung zu stellen.

Die Absendung in CLOS ist auch von den meisten OO Sprachen verschieden:

  1. In Anbetracht einer Liste von Argumenten wird eine Liste von anwendbaren Methoden bestimmt.
  2. Diese Liste wird gemäß der Genauigkeit ihres Parameters specializers sortiert.
  3. Ausgewählte Methoden von dieser Liste werden dann in eine wirksame Methode mit der durch die allgemeine Funktion verwendeten Methode-Kombination verbunden.
  4. Die wirksame Methode wird dann mit den ursprünglichen Argumenten genannt.

Dieser Absendungsmechanismus arbeitet an der Durchlaufzeit. Das Hinzufügen oder das Entfernen von Methoden können so zu geänderten wirksamen Methoden führen (selbst wenn die allgemeine Funktion mit denselben Argumenten genannt wird) an der Durchlaufzeit. Das Ändern der Methode-Kombination kann auch zu verschiedenen wirksamen Methoden führen.

Zum Beispiel,

erklären Sie den allgemeinen Argument-Struktur-Prototyp

(defgeneric f (x y))

definieren Sie eine Durchführung dafür (f ganze Zahl t), wo t alle Typen vergleicht

(defmethod f ((x ganze Zahl) y) 1)

(f 1 2.0) => 1

definieren Sie eine Durchführung für (f ganze Zahl echt)

(defmethod f ((x ganze Zahl) (y echt)) 2)

(f 1 2.0) => 2; Absendung hat sich an der Durchlaufzeit geändert

</Quelle>

Wie die OO Systeme auf den meisten dynamischen Sprachen macht CLOS encapsulation nicht geltend. Auf jedes Ablagefach kann mit der Funktion oder über (fakultativ autoerzeugt) Zugriffsberechtigter-Methoden zugegriffen werden. Um darauf über Sie zuzugreifen, müssen den Namen des Ablagefaches wissen. Programmierer der KL. verwenden die Paket-Möglichkeit der Sprache zu erklären, welche Funktionen oder Datenstrukturen für den Export beabsichtigt sind.

Abgesondert von normalen ("primären") Methoden gibt es auch, und "Hilfs"-Methoden. Die ehemaligen zwei werden vor, oder nach der primären Methode in einer besonderen auf der Klassenhierarchie gestützten Ordnung angerufen. Eine Methode kann kontrollieren, ob die primäre Methode überhaupt durchgeführt wird. Zusätzlich kann der Programmierer angeben, ob alle möglichen primären Methoden entlang der Klassenhierarchie genannt werden sollten oder gerade diejenige, die das nächste Match zur Verfügung stellt.

Die Normale Methode-Kombination stellt über der Vorwahl vorher danach und um Methoden zur Verfügung. Es gibt andere Methode-Kombinationen mit anderen Methode-Typen. Neu (sowohl einfach als auch kompliziert) können Methode-Kombinationen und Methode-Typen definiert werden.

CLOS erlaubt Mehrfachvererbung. Wenn die Verzug-Ordnung, in der Methoden in der Mehrfachvererbung durchgeführt werden, nicht richtig ist, kann der Programmierer die Diamanterbe-Probleme auflösen, indem er die Ordnung von Methode-Kombinationen angibt.

CLOS ist dynamisch, bedeutend, dass nicht nur der Inhalt, sondern auch die Struktur seiner Gegenstände an der Durchlaufzeit modifiziert werden können. CLOS Unterstützungen, die Klassendefinitionen während der Übertragung ändern (selbst wenn Beispiele der fraglichen Klasse bereits bestehen), sowie das Ändern der Klassenmitgliedschaft eines gegebenen Beispiels durch den Maschinenbediener. CLOS erlaubt auch, Methoden an der Durchlaufzeit hinzuzufügen, wiederzudefinieren und zu entfernen. Das Kreisellipse-Problem wird in CLOS sogleich behoben, und die meisten OOP Designmuster entweder verschwinden oder sind qualitativ einfacher.

CLOS ist nicht eine Prototyp-Sprache: Klassen müssen definiert werden, bevor Gegenstände als Mitglieder dieser Klasse realisiert werden können.

Metaobject Protokoll

Außerhalb des ANSI Allgemeinen Lispeln-Standards gibt es eine weit durchgeführte Erweiterung auf CLOS genannt das Metaobject Protokoll (MOPP). Der MOPP definiert einen Normanschluss zu den Untermauerungen der CLOS Durchführung, Klassen, Ablagefach-Beschreibungen, allgemeine Funktionen und Methoden selbst als Beispiele von metaclasses behandelnd, und erlaubt die Definition von neuem metaclasses und die Modifizierung des ganzen CLOS Verhaltens. Die Flexibilität des CLOS MOPPS kündigt Aspekt-orientierte Programmierung an, die später von einigen derselben Ingenieure wie Gregor Kiczales entwickelt wurde. Der MOPP definiert das Verhalten des ganzen Gegenstand-Systems durch eine Reihe von Protokollen. Diese werden in Bezug auf CLOS definiert. So ist es möglich, neue Gegenstand-Systeme durch das Verlängern oder das Ändern der zur Verfügung gestellten CLOS Funktionalität zu schaffen. Das Buch Die Kunst des Metaobject Protokolls beschreibt den Gebrauch und die Durchführung des CLOS MOPPS.

Die verschiedenen Allgemeinen Lispeln-Durchführungen haben ein bisschen verschiedene Unterstützung für das Meta-Gegenstand-Protokoll. Das Nähere Projekt hat zum Ziel, die fehlenden Eigenschaften zur Verfügung zu stellen.

Einflüsse von älteren Lispeln-basierten Gegenstand-Systemen

Geschmäcke (und sein Nachfolger Neue Geschmäcke) waren das Gegenstand-System auf der MIT-Lispeln-Maschine. Große Teile der Lispeln-Maschine Betriebssysteme und viele Anwendungen dafür verwenden Geschmäcke oder Neue Geschmäcke. Geschmäcke haben Mehrfachvererbung und mixins unter anderen Eigenschaften eingeführt. Geschmäcke sind größtenteils veraltet, obwohl Durchführungen für das Allgemeine Lispeln wirklich bestehen. Geschmäcke verwendeten die Nachricht vorübergehendes Paradigma. Neue Geschmäcke haben allgemeine Funktionen eingeführt.

CommonLoops war der Nachfolger von SCHLEIFEN (vom Xerox-Zwischenlispeln-D). CommonLoops wurde für das Allgemeine Lispeln durchgeführt. Eine tragbare Durchführung genannt Tragbarer CommonLoops (PCL) war die erste Durchführung von CLOS. PCL wird weit getragen und stellt noch die Basis für die CLOS Durchführung von mehreren Allgemeinen Lispeln-Durchführungen zur Verfügung. PCL wird größtenteils im tragbaren Allgemeinen Lispeln mit nur einigen Systemabhängiger-Teilen durchgeführt.

Literatur

  • Sonya Keene, 1988, Addison-Wesley. Internationale Standardbuchnummer 0-201-17589-4
  • Gregor Kiczales, Jim des Rivieres, und Daniel G. Bobrow, Die Kunst des Metaobject Protokolls, 1991, MIT Presse. Internationale Standardbuchnummer 0-262-61074-4
  • Jo A. Lawless und Molly M. Miller, 1991, Digitalpresse, internationale Standardbuchnummer 1555580645
  • Andreas Paepcke, 1993, Die MIT-Presse. Internationale Standardbuchnummer 0262161362
  • Das Allgemeine Lispeln-Gegenstand-System: Eine Übersicht von Richard P. Gabriel und Linda DeMichiel stellt eine gute Einführung in die Motivation zur Verfügung, um Klassen mittels allgemeiner Funktionen zu definieren.
  • Grundlagen von CLOS durch Nick Levine stellen eine schrittweise Aussetzung von der Durchführung von OO Konzepten in CLOS zur Verfügung, und wie man sie verwertet. Es ist für jeden mit einer Grundkenntnisse des Lispelns oder Schemas beabsichtigt.
  • Allgemeines Lispeln HyperSpec, Kapitel 7: Gegenstände

Source is a modification of the Wikipedia article Common Lisp Object System, licensed under CC-BY-SA. Full list of contributors here.
Vielfache Absendung / Kuno Fischer
Impressum & Datenschutz