# , # 'is cached' multi sub trait_mod:<is>(Routine $r, :$cached!) { my %cache; # , $r.wrap(-> $arg { # %cache{$arg}:exists ?? %cache{$arg} # ... , !! (%cache{$arg} = callwith($arg)) } ); } # : sub fib($x) is cached { say("fib($x)"); $x <= 1 ?? 1 !! fib($x - 1) + fib($x - 2); } # 0 10 say fib(10);
特異点は動詞に適用されます。この場合は-です。 機能を処理する関数の名前で示されます。ここにtrait_modがあります。 ハンドラー引数は、機能が適用されるオブジェクト、および名前付き引数としての機能名(キャッシュ)です。
この例では、関数の.wrapメソッドが呼び出されますが、もちろん何でも呼び出すことができます。 これは通常、役割を関数に含めるか、役割を配布テーブルに追加するために使用されます。
機能は、関数だけでなく、パラメーター、属性、変数にも適用できます。 たとえば、書き込みアクセスを持つアクセサは、rw機能を介して実装されます。
class Book { has @.pages is rw; ... }
また、機能を使用して、ドキュメントをクラスおよび属性に添付し、関数パラメーターを書き換え可能としてマークし、継承クラスを宣言し、それらにロールを適用します。