中缀:< >子程序的作用域如何影响EVAL?

9
这段代码按预期工作:
sub infix:<mean>(*@a) {
    @a.sum / @a.elems
}
sub Mean (*@a) {
    @a.sum  / @a.elems
}

say EVAL 'Mean 2, 6, 4';     # Output: 4
say EVAL '2 mean 6 mean 4';  # Output: 4

当第7行处于自己的作用域时,它按预期工作。
{say EVAL 'Mean 2, 6, 4';}   # Output: 4

但是当第8行处于它自己的作用域时:
{say EVAL '2 mean 6 mean 4';} 

===SORRY!=== Error while compiling .../EVAL_1
Two terms in a row
at .../EVAL_1:1
------> 2⏏ mean 6 mean 4
    expecting any of:
        infix
        infix stopper
        statement end
        statement modifier
        statement modifier loop


为什么这两个子标题被不同对待?

1
当我在2022.02版本的Rakudo中运行你展示的代码时,一切都正常工作。我的两个假设是:1. 你正在使用有错误的REPL(参考为什么Raku REPL中的新操作符定义不会持久存在?);或者2. 最近的Rakudos中存在某些相关或不同的错误(尽管我目前认为这种可能性很小)。我现在没有时间进一步调查。 - raiph
1
当我在2022.02的Rakudo中运行你展示的代码时,一切都正常工作。我的两个假设是:1:你正在使用有问题的REPL(可参考为什么新的运算符定义不能在Raku REPL中保持?),或者2:最近的Rakudos存在某些相关或不同的错误(虽然我目前认为这种可能性较小)。我现在没有时间进一步调查。 - raiph
1个回答

8

这是一个已知的问题,也会影响到 REPL。

问题在于执行字符串 EVAL 时会“看到”周围作用域及其所有的添加内容,因此:

say EVAL 'infix:<mean>(infix:<mean>(2, 6), 4)';

产生4,因为子表达式&infix:<mean>(*@a)已知的。

但是为了使其作为中缀运算符工作,语法的变化目前没有EVAL内部看到。这就是为什么你会看到编译时错误。

我对我们能够通过基于RakuAST的新的Raku语法来解决这个问题抱有很大的希望。


有趣!看来有人需要进行二分查找了。 - Elizabeth Mattijsen
有趣!看来有人需要进行一次二等分。 - Elizabeth Mattijsen
我对bisectable的一些运行总结的要点是,它在2017年大部分时间都出现了问题,然后在今年年初再次出现了问题,而bisectable提供的信息只能确定2018年初修复了它(由Zoffix提交的一个commit)。 - raiph
我的总结是,可二分运行的摘要在2017年大部分时间内都出现了故障,然后在今年年初再次出现故障。而bisectable提供的信息只能确切地说明在2018年初是如何修复的(由Zoffix提交的变更)。 - raiph
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接