変数によって参照されるトークンにパラメータを渡す方法は?


10

トークン名を直接使用することで、トークン署名を簡単に使用できます。

my token t ( $x ) { $x };

'axb' ~~ / 'a' <t: 'x'> 'b' /;      # match
'axb' ~~ / 'a' <t( 'x' )> 'b' /;    # match

ただし、トークンが変数に格納されている場合、これを行う方法が見つかりませんでした。

my $t = token ( $x ) { $x };

'axb' ~~ / 'a' <$t: 'x'> 'b' /;
'axb' ~~ / 'a' <$t( 'x' )> 'b' /;

両方が与える:

===SORRY!=== Error while compiling ...
Unable to parse expression in metachar:sym<assert>; couldn't find final '>'

それを行うための魔法の構文は何ですか?

ところで:私はRakuテストスイートを閲覧したこともあり、そのようなケースは含まれていませんroast/S05-grammar/signatures.t

回答:


8

どちらか:

  • jnthnの回答にあるソリューションを使用して、$シギル化されたトークン変数をとして使用することをRakuに明示的に通知しますCallable

  • Callable最初に明示的に変数を宣言し、呼び出しに対応する変更を加えます。

my &t = token ( $x ) { $x };

say 'axb' ~~ / 'a' <&t: 'x'> 'b' /;   # 「axb」
say 'axb' ~~ / 'a' <&t( 'x' )> 'b' /; # 「axb」

2
トークンは特定の属性が設定された正規表現であり、正規表現は呼び出し可能オブジェクトであるため、&変数に入る可能性があることを指摘するのに役立つかもしれません。
user0721090601

1
ありがとう!jnthnは私の質問に非常に直接答えましたが、これは私の問題の本当の原因、つまり間違った印を強調しているので、これを答えとしてフラグを立てています。トークンを最初からCallableとして扱うことは、より明確な解決策です。
Pawel Pabian bbkr

11

置き&変数の前に:

my $t = token ( $x ) { $x };
say 'axb' ~~ / 'a' <&$t: 'x'> 'b' /;
say 'axb' ~~ / 'a' <&$t( 'x' )> 'b' /;

パーサーはを検索&し、Raku変数解析ルールに委任します。これにより、このようなコンテキストアライザがうまく解析されます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.