-1. Sınırlamalar (sadece paketler için)
EXPORTHOW yöntemi , ikincisine argo ekleyerek geçerli olarak .set_how öğesini çağırır $?LANG
.
Sonra add_package_declarator için MAIN
$?LANG
bir ekler package_declarator
onun Eylemler ve gramerine yöntemi. Bence tek "dinamik argo" (World.nqp içinde).
İstediğiniz şey routine_declarator üzerine yazmaksa . O zaman, atıfta bulunulan zinciri taklit eden bir argo yazmalısınız. Method anahtar sözcüğünü saklamayı ve sınıfta otomatik imza oluşturmayı kabul ederseniz, yöntem adına göre diyelim, işte bir yol:
Not: Paket bir kaptır (paket, dilbilgisi, modül, rol, knowhow, numaralandırma, sınıf, altküme). Kodu bir yöntem gibi içine koyarsanız, bu yürütülür (Ben sadece denedim):
0. Tanım (İHRACAT)
Phaser ile bir yol bulamadığım için belgelenmemiş EXPORTHOW ve DECLARE
bir modülde kullanırım . Görünüşe göre BEGIN'de bile çok geç.
Verdiğim örnek, bir sınıftaki (çift BUILDALL
) her yöntemi dekore etmektir .
1. Lib ( decorator.rakumod
)
class DecoratedClassHOW is Metamodel::ClassHOW {
method add_method(Mu $obj, $name, $code_obj) {
sub wrapper ($obj, $a, $b) {
say "Before $name";
my $res = $code_obj($obj, $a, $b);
say "After $name";
return $res;
}
my $res = callwith($obj, $name, &wrapper);
return $res;
}
}
my module EXPORTHOW {
package DECLARE {
constant decorated = DecoratedClassHOW;
}
}
2. Yürütülebilir
use lib '.';
use decorator-lib;
decorated Foo {
method abc($a, $b) {
say "In abc: $a:$b";
}
}
my $f = Foo.new;
$f.abc(1, 2);
3. Çıktı
Before BUILDALL
After BUILDALL
Before abc
In abc: 1:2
After abc
4. Kaynaklar