Sollte Perl 6 in der Lage sein, die Einbeziehung derselben Rolle aus verschiedenen Quellen zu entwirren?

8

Stellen Sie sich eine Reihe komplexer Grammatiken vor, die als Rollen dargestellt werden, obwohl dieses einfache Beispiel ausreicht, um den Konflikt zu zeigen:

%Vor%

Dies funktioniert nicht, da Perl 6 die Beziehungen nicht entwirrt, um herauszufinden, dass der Konflikt tatsächlich aus derselben Quelle stammt:

  

Die Methode 'alpha' muss von der Klasse Thingy aufgelöst werden, da sie in mehreren Rollen existiert

Aber beim Lesen von S14 sehe ich:

  

Eine Rolle darf nicht von einer Klasse erben, sondern kann aus anderen Rollen bestehen. Diese "crony" -Zusammensetzung wird jedoch nicht vor der Klassenzusammensetzungszeit ausgewertet. Das bedeutet, dass, wenn zwei Rollen denselben Crony einbringen, es keinen Konflikt gibt - es ist so, als ob die Klasse die Crony-Rolle selbst und die entsprechenden Rollen nicht eingezogen hätte. Eine Rolle darf niemals mit sich selbst in Konflikt geraten, unabhängig von ihrer Art der Einbindung.

Ich habe gelesen, dass die Rollen so spät wie möglich angewendet werden, so dass die Klasse Thingy in der Lage wäre zu entwirren, dass Alpha in zwei verschiedenen Teilen enthalten ist. Ich dachte, das würde so etwas wie das Erstellen einer Liste aller Rollen, aus denen die letzte Klasse bestehen würde, bewirken und dann diese Liste nur auf die letzte Klasse anwenden. Auf diese Weise würde etwas wie Either nur die Dinge mischen, die es definiert hat, und würde sich auf die spätere Zusammensetzung verlassen, um Alpha einzubringen.

Ich bin darüber gestolpert, als ich versucht habe, Grammatiken für verschiedene (IETF) RFCs zu implementieren. Viele von ihnen verweisen auf die Grammatiken anderer RFCs, was es unmöglich macht, dass Perl 6 die Vererbung durch C3 auflöst. Also dachte ich, dass Rollen die Beziehungen trennen würden. Anscheinend tut es das nicht.

    
brian d foy 22.01.2017, 13:41
quelle

1 Antwort

3

Ja, Perl 6 sollte in der Lage sein, die Einbeziehung derselben Rolle aus verschiedenen Quellen zu entwirren.

Einfache Definition von Eine Rolle sind:

  

Eine Rolle kapselt einige Verhaltensweisen oder Zustände ein, die von Klassen gemeinsam genutzt werden können.

oder

  

Eine Rolle ist ein Name für eine bestimmte Sammlung von Verhaltensweisen.

Nehmen wir an, wir haben ein Floatable Verhalten für Objekte, die auf dem Wasser schwimmen können, und ein Sailable Verhalten für Objekte, die gesegelt werden können. Natürlich können Objekte, die gesegelt werden können, schweben. A Sloop ist natürlich schwimmfähig und segelbar. Es besteht kein Konflikt darin, dass das Verhalten same Floatable sowohl von den Rollen Floatable als auch Sailable vermittelt wird.

In Perl funktioniert das wie erwartet (es funktioniert auch mit Moose ):

%Vor%

Dieses Verhalten ist intuitiv offensichtlich.

Ein Problem, das mir bei der Perl6-Dokumentation für Rollen aufgefallen ist, ist das Fehlen eines einfachen Satzes definition:

  

Rollen ähneln in gewisser Weise Klassen, da sie eine Sammlung von Attributen und Methoden sind. Sie unterscheiden sich dadurch, dass Rollen auch dazu dienen, nur Teile des Verhaltens eines Objekts zu beschreiben und wie Rollen auf Klassen angewendet werden. Oder anders ausgedrückt, Klassen sind für die Verwaltung von Objekten gedacht, und Rollen sind für die Verwaltung von Verhalten und Wiederverwendung von Code gedacht.

...

  

Die Rollenanwendung unterscheidet sich erheblich von der Klassenvererbung. Wenn eine Rolle auf eine Klasse angewendet wird, werden die Methoden dieser Rolle in die Klasse kopiert. Wenn mehrere Rollen auf dieselbe Klasse angewendet werden, verursachen Konflikte (z. B. Attribute oder Nicht-Multi-Methoden mit demselben Namen) einen Fehler bei der Kompilierung, der durch die Bereitstellung einer gleichnamigen Methode in der Klasse gelöst werden kann.

>

Offensichtlich, wenn perl6 auf zwei Rollen trifft, die das exakt gleiche Verhalten liefern, hält es das für einen Konflikt, den ich für unvernünftig halte.

Beachten Sie die feine Unterscheidung im folgenden Beispiel:

%Vor%

In diesem Fall ist der Konflikt zu erwarten, weil zwei verschiedene Rollen behaupten wollen, dieselben Verhaltensweisen zu bieten.

    
Sinan Ünür 01.07.2017, 17:26
quelle

Tags und Links