作用域如何影响 infix:<> sub 的 EVAL?

Jim*_*ger 9 scope infix-notation subroutine raku

此代码按预期工作:

\n
sub infix:<mean>(*@a) {\n    @a.sum / @a.elems\n}\nsub Mean (*@a) {\n    @a.sum  / @a.elems\n}\n\nsay EVAL 'Mean 2, 6, 4';     # Output: 4\nsay EVAL '2 mean 6 mean 4';  # Output: 4\n
Run Code Online (Sandbox Code Playgroud)\n

当第 7 行在其自己的范围内时,它会按预期工作:

\n
{say EVAL 'Mean 2, 6, 4';}   # Output: 4\n
Run Code Online (Sandbox Code Playgroud)\n

但是当第 8 行在它自己的作用域内时:

\n
{say EVAL '2 mean 6 mean 4';} \n\n===SORRY!=== Error while compiling .../EVAL_1\nTwo terms in a row\nat .../EVAL_1:1\n------> 2\xe2\x8f\x8f mean 6 mean 4\n    expecting any of:\n        infix\n        infix stopper\n        statement end\n        statement modifier\n        statement modifier loop\n\n
Run Code Online (Sandbox Code Playgroud)\n

为什么这两个替补的待遇不同?

\n

Eli*_*sen 8

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

问题是,执行字符串EVAL将“看到”周围的范围及其所有添加内容,因此:

say EVAL 'infix:<mean>(infix:<mean>(2, 6), 4)';
Run Code Online (Sandbox Code Playgroud)

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

但允许它作为中缀工作的语法更改目前EVAL. 这就是您看到编译时错误的原因。

我非常希望我们能够使用基于 RakuAST 的新 Raku 语法来解决这个问题。