... или как изменить значение $<sigil>.Str
с token sigil { ... }
в зависимости от сопоставленного текста . Да, я спрашиваю, как обмануть грамматики выше (то есть вызывать) меня.
Я пытаюсь написать Сленг для Раку без сигил .
Итак, я хочу, чтобы токен nogil
, соответствующий чему-либо <?>
, возвращал NqpMatch со строкой: $<sigil>.Str
в '$'.
В настоящее время мой сигил с токеном выглядит так
token sigil {
| <[$@%&]>
| <nogil> { say "Nogil returned: ", lk($/, 'nogil').Str; # Here It should print "$"
}
}
token nogil-proxy {
| '€'
| <?>
{log "No sigil:", get-stack; }
}
И метод с этим должен вернуть NQPMatch
с методом Str
перезаписанным
method nogil {
my $cursor := self.nogil-proxy;
# .. This si where Nqp expertise would be nice
say "string is:", $cursor.Str; # here also it should print "$"
return $cursor;
}
Неудачная попытка:
$cursor.^cache_add('Str', sub { return '$'; } );
$cursor.^publish_method_cache;
for $cursor.^attributes { .name.say };
for $cursor.^methods { .name.say };
say $cursor.WHAT.Str;
nqp::setmethcacheauth($cursor, 0);
В настоящее время большинство мои тесты работают, но у меня есть проблемы в объявлениях без моего (с no strict
) типа my-var = 42;
, потому что они рассматриваются как вызов метода.
@ Арне-Соммер уже сделал сообщение и статья . Это тесно связано. Но этот вопрос имеет целью:
Как мы можем настроить возвращаемое значение токена времени компиляции, а не как его объявить.