Як передавати параметри в маркер, на який посилається змінна?


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 '>'

Який магічний синтаксис для цього зробити?

BTW: Я навіть переглядав тестовий набір Raku, і він не включає такий випадок roast/S05-grammar/signatures.t.

Відповіді:


8

Або:

  • Використовуйте рішення у відповіді jnthn, щоб дозволити Раку чітко знати, що ви хочете використовувати свою $змінну токена sigil'd якCallable .

  • Визначте змінну як явно Callableна першому місці та внесіть відповідну зміну у виклик:

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

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

2
Може бути корисним, щоб вказати, що лексеми - це просто регексени з певними наборами атрибутів, а regexen, у свою чергу, є Callables, отже, вони можуть перейти в &змінні.
користувач0721090601

1
Дякую! Хоча jnthn відповів на моє запитання дуже безпосередньо, я позначаю це як відповідь, оскільки він підкреслює справжню причину моєї проблеми - неправильний сигіл. Поводження з маркером як дзвінок із самого початку - набагато чистіше рішення.
Pawel Pabian bbkr

11

Помістіть &перед змінною:

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

Парсер шукає &, а потім делегує правилу розбору змінної Raku, яке з радістю розбере такий контекстуалізатор, як цей.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.