Disons que j'utilise un certain ensemble de passe-partout assez régulièrement:
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;
…
}
}
Je préfère pouvoir simplement dire:
class Foo is/does Bar {
bar abc { … }
bar xyz { … }
bar blarg { … }
}
Et quelque part dans Bar, configurez la déclaration pour bar (ou, puisque la classe Foo utilisera elle-même finalement son propre déclarant, elle pourrait aller ailleurs et n'a pas besoin d'être extraite dans un type séparé). Comment pourrais-je procéder?
Réponses:
-1. Limitations (uniquement pour les packages)
La méthode EXPORTHOW appelle .set_how sur le courant en
$?LANG
ajoutant un argot à ce dernier.Ensuite, il ajoute add_package_declarator au
MAIN
$?LANG
qui ajoute unepackage_declarator
méthode à ses actions et à sa grammaire. C'est, je pense, le seul "argot dynamique" (dans World.nqp).Si vous voulez écraser routine_declarator . Ensuite, vous devez écrire un argot imitant la chaîne que je viens de citer. Si vous acceptez de conserver le mot-clé method et de faire la signature automatique dans la classe, disons selon le nom de la méthode, voici un moyen:
Remarque: Un package est un conteneur (package, grammaire, module, rôle, savoir-faire, énumération, classe, sous-ensemble). Si vous mettez du code à l'intérieur comme une méthode, cela s'exécute (je viens de l'essayer):
0. Description (EXPORTATION)
J'utiliserais EXPORTHOW non documenté et
DECLARE
dans un module car je n'ai pas trouvé de moyen avec Phaser . Apparemment, il est trop tard, même à BEGIN.L'exemple que je donne est de décorer chaque méthode d'une classe (même
BUILDALL
).1. Lib (
decorator.rakumod
)2. Exécutable
3. Sortie
4. Sources
for $_.HOW.method_table($_)
création d'un nouveau hachage écrasant le cache de méthode avec le (bien nommé)nqp::setmethcache
.la source