Digamos que eu use um certo conjunto de clichês regularmente:
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;
…
}
}
Prefiro dizer:
class Foo is/does Bar {
bar abc { … }
bar xyz { … }
bar blarg { … }
}
E em algum lugar em Bar, configure a declaração para bar (ou, como a própria classe Foo finalmente usará seu próprio declarador, ele poderá ir para outro lugar e não precisará ser extraído em um tipo separado). Como eu faria isso?
Respostas:
-1. Limitações (apenas para pacotes)
O método EXPORTHOW chama .set_how na atual
$?LANG
adicionando uma gíria à última.Em seguida, adicione add_package_declarator ao
MAIN
$?LANG
qual adiciona umpackage_declarator
método às suas ações e gramática. Acho que é a única "gíria dinâmica" (no World.nqp).Se o que você deseja é substituir o rotina_declarador . Então você tem que escrever uma gíria que imita a corrente citada. Se você aceitar manter a palavra-chave method e criar a assinatura automática na classe, digamos de acordo com o nome do método, aqui está uma maneira:
Nota: Um pacote é um contêiner (pacote, gramática, módulo, função, know-how, enum, classe, subconjunto). Se você colocar o código dentro como um método, isso é executado (eu apenas tentei):
0. Descrição (EXPORTHOW)
Eu usaria EXPORTHOW não documentado e
DECLARE
em um módulo porque não encontrei um caminho com a Phaser . Aparentemente, é tarde demais, mesmo no início.O exemplo que dou é decorar todos os métodos de uma classe (par
BUILDALL
).1. Lib (
decorator.rakumod
)2. Executável
3. Saída
4. Fontes
for $_.HOW.method_table($_)
criando um novo hash substituindo o cache do método pelo (bem nomeado)nqp::setmethcache
.fonte