Wyobraź sobie szereg skomplikowanych gramatyk reprezentowane ról, choć prosty przykład wystarczy, aby pokazać konflikt:Czy Perl 6 powinien móc rozplątać włączenie tej samej roli z różnych źródeł?
role Alpha {
token alpha { :i <[A..Z]> }
}
role Digit {
token digit { <[0..9]> }
}
role Either
does Alpha
does Digit {
token either { <alpha> | <digit> }
}
grammar Thingy
does Either
does Alpha
{
token TOP { <alpha> <either>* }
}
my $match = Thingy.parse('1a3');
dd $match;
To nie działa, ponieważ Perl 6 nie rozwikłać relacje, aby dowiedzieć się, że konflikt jest rzeczywiście samo z tego samego źródła:
Metoda „alpha” musi być rozwiązany przez klasy thingy, ponieważ występuje w wielu rolach
Ale czytając S14, Rozumiem:
Rola może nie dziedziczyć z klasy, ale może składać się z innych ról. Jednak ta kompozycja "kolesia" nie jest oceniana do czasu komponowania klasy. Oznacza to, że jeśli dwie role sprowadzają się do tego samego kumpla, nie ma konfliktu - to tak, jakby klasa wcieliła się w rolę kolesiów, a odpowiednie role nie. Rola może nigdy nie być w konflikcie z samym sobą, bez względu na metodę jej inkorporacji.
Czytałem, że oznaczać, że role są stosowane tak późno, jak to możliwe, więc klasa Thingy
będzie w stanie wyplątać że Alpha
jest zawarta w dwóch różnych części. Pomyślałem, że to będzie działać jak tworzenie listy wszystkich ról, które będą składać się na końcową klasę, a następnie stosowanie tej listy tylko do ostatniej klasy. W ten sposób coś takiego jak Either
może łączyć tylko te rzeczy, które zdefiniował i będzie polegało na późniejszej kompozycji, aby wprowadzić Alpha
.
Przebiegłem to, gdy próbowałem implementować gramatykę dla różnych (IETF) dokumentów RFC. Wiele z nich odwołuje się do gramatyk z innych RFC, co uniemożliwia Perlowi 6 rozstrzyganie dziedziczenia przez C3. Pomyślałem więc, że role oderwą związki. Najwyraźniej tak nie jest.
Czy ma to coś wspólnego z gramatyką? Następujące błędy kończą się tak samo (i zgodnie z oczekiwaniami): 'perl6 -e 'rola Foo {method bar {}}; rola Baz {pasek metod {}}; class My :: Grammar {także robi Foo; również robi Baz; } '' W przeciwnym razie możesz, oczywiście, rozwiązać go samodzielnie (co jest wymienione w dokumentach dla ról):' Host tokena {$ = [' : "<.port>]? } ' –
ugexe
Nie jest to zasadniczo specyficzne dla gramatyk, ale o wiele bardziej użyteczne dla nazwanych reguł, które mogą pojawić się w kilku częściach gramatyki. Wolałbym nie rozwiązywać problemów samemu, ponieważ jest to ogromny bałagan, gdy gramatyki są ogromne. –
Odpowiedź na pytanie w tytule brzmi "tak, powinno". –