Powiedzmy, że używam pewien zestaw płyt kotłowych dość regularnie:
class Foo {
method abc($a: $b, $c, +@d) is pure {
use Slang::Bar;
…
}
method xyz($a: $b, $c, +@d) is pure {
use Slang::Bar;
…
}
method blarg($a: $b, $c, +@d) is pure {
use Slang::Bar;
…
}
}
Wolałbym móc po prostu powiedzieć:
class Foo is/does Bar {
bar abc { … }
bar xyz { … }
bar blarg { … }
}
I gdzieś w Barze ustaw deklarację dla baru (lub, ponieważ klasa Foo sama ostatecznie użyje własnego deklaratora, może pójść gdzie indziej i nie musi być wyciągana w osobnym typie). Jak miałbym to zrobić?
Odpowiedzi:
-1. Ograniczenia (tylko w przypadku pakietów)
Metoda EXPORTHOW wywołuje .set_how na bieżąco,
$?LANG
dodając do niego slang.Następnie dodaje add_package_declarator do,
MAIN
$?LANG
który dodajepackage_declarator
metodę do swoich akcji i gramatyki. Myślę, że to jedyny „dynamiczny slang” (w World.nqp).Jeśli chcesz zastąpić routine_declarator . Następnie musisz napisać slang imitujący właśnie cytowany łańcuch. Jeśli akceptujesz zachowanie słowa kluczowego metody i automatyczne podpisywanie w klasie, powiedzmy zgodnie z nazwą metody, oto sposób:
Uwaga: Pakiet jest kontenerem (pakiet, gramatyka, moduł, rola, know-how, wyliczanie, klasa, podzbiór). Jeśli wstawisz kod jak metodę, zostanie to wykonane (właśnie próbowałem):
0. Opis (EKSPORT)
Użyłbym nieudokumentowane EXPORTHOW oraz
DECLARE
w module bo nie znaleźć sposób z Phaser . Najwyraźniej jest już za późno, nawet w BEGIN.Daję przykład, że dekoruję każdą metodę w klasie (nawet
BUILDALL
).1. Lib (
decorator.rakumod
)2. Plik wykonywalny
3. Wyjście
4. Źródła
for $_.HOW.method_table($_)
tworzeniem nowego skrótu zastępującego pamięć podręczną metod (dobrze nazwaną)nqp::setmethcache
.źródło