【发布时间】:2018-05-26 17:48:07
【问题描述】:
如this issue 中所示,一些标记名称与语法的类层次结构中的方法名称冲突(包括Match、Capture、Cool、Any,显然还有My。)。比如`Mu.item
grammar g {
token TOP { <item> };
token item { 'defined' }
};
say g.parse('defined');
发出类似这样的错误:
Too many positionals passed; expected 1 argument but got 2
in regex item at xxx
item is part of Anys methods, too;我在其他类中没有找到任何其他名称通常失败的方法,但是没有定义任何子类(item 除外);大多数是多重或实际上定义为method。
当BUILD 的TWEAK 之类的子方法用于令牌名称时也会发生这种情况,但这种情况下的错误是不同的:
Cannot find method 'match': no method cache and no .^find_method
at xxx
但是,像FALLBACK这样的其他子方法完全没有问题:
grammar g {
token TOP { <FALLBACK> };
token FALLBACK { 'defined' }
};
say g.parse('defined') # OUTPUT: «「defined」 FALLBACK => 「defined」»
同样适用于 Grammar 类层次结构中的一些其他方法,例如 rand,或者一般来说,大多数方法都这样定义。
有问题的名称似乎有一个共同点,即它们被声明为sub,但并非总是如此:最初导致整个问题的CREATE 被声明为method。因此,我完全不清楚要避免使用哪些名称,以及可以合法使用哪些名称。有人可以澄清一下吗?
【问题讨论】:
-
对于将来阅读本文的其他人,根据 JJ 对我的回答的评论,在他的问题标题中,“规则”一词用于英语意义,“规则”一词用于 P6 意义(即语法中的规则/令牌/正则表达式/方法)并且元对象是,我认为,Rakudo 的Perl6::Metamodel::GrammarHow,也许还有一些类似的 nqp 元对象。
-
@raiph 补充了一些解释:如上所述,
item也是 Any 的一部分,但测试的其他功能实际上都不是subs,因此可能只有Mu方法或Musubs 失败。这就是我想知道的。 -
对此没有简单的答案。至少存在三个独立的错误,每个错误对规则命名都有其自身的复杂影响。 Moritz 和 Lizmat 确认了一个听起来不像是我在回答中提到的三个问题的重复问题,因此很可能至少存在四个与规则命名相关的错误/问题,并且可能会出现更多问题。请放弃修复这一特定错误巢的想法,通过记录如何通过荒谬复杂的命名规则来避免它们。你会浪费你和其他人的时间。如果您不相信,请仔细阅读我的回答。
-
好的。我不确定,我觉得我需要强调这是疯狂的复杂,远远超出了任何文档工作所能解决的范围。感谢您对我们沟通的耐心等待。 :)
-
/o\ 情况变得更糟。
TWEAK错误会导致编译时错误。我现在看到我认为可能涵盖它的错误并没有被写为编译时错误。也许莫里茨的。调查和答案重写继续......
标签: grammar raku meta-object-protocol