Intro: После многих подобных ошибок с nqp я понял:
Краткое описание: nqp
+ Scalar
в сообщении об ошибке -> replace =
на :=
Объясните: Используйте оператор связывания : = , а не присваивание = , которое при автоматической блокировке в скаляре приводит к ошибке сообщение со скаляром.
Демонстрация: Полностью рабочий пример (используйте в BEGIN phaser ). Попытка "my" €
сигил и "их" (скомпилировать на языке) на случай, если моя не удастся.
my $main-grammar = $*LANG.slang_grammar('MAIN');
my $main-actions = $*LANG.slang_actions('MAIN');
role Nogil::NogilGrammar {
method sigil {
# Bind
my $sigil-they := $main-grammar.^find_method('sigil');
my $sigil-me := self.sigil-eu;
# Check My
return $sigil-me if $sigil-me;
# Return Their
return $sigil-they(self);
}
token sigil-eu { '€' }
}
my $grammar = $main-grammar.^mixin(Nogil::NogilGrammar);
$*LANG.define_slang('MAIN', $grammar, $main-actions);
Примечание 1: Я удалил некоторые say
необходимые для демонстрации , Просто добавьте .Str
к этим экзотериальным c объектам (NQPMatches).
Примечание2: Если вы хотите создать временные переменные (например, $res
), сохраняйте привязку (:=
).