在 eval 中使用导入的代数数据类型

Use imported Algebraic Data Type in eval

我正在使用 eval 函数根据列表评估抽象列表模式,它不断出现未声明的变量错误。下面包含一个可重现的小示例。

module PuzzleScript::Test::Engine::EvalExample

import util::Eval;
import IO;

data Animal = dog() | cat();

void main(){    
    bool boolean = [*_, cat(), *_] := [dog(), cat()];
    if (boolean) println("True 1");
    
    println("[*_, cat(), *_] := [dog(), cat()];");
    Result[bool] re = eval(#bool, "[*_, cat(), *_] := [dog(), cat()];");
    if (re.val) println("True 2");

}

这会产生以下错误

Rascal Version: 0.18.2, see |release-notes://0.18.2|
rascal>import PuzzleScript::Test::Engine::EvalExample;
ok
rascal>main()
True 1
[*_, cat(), *_] := [dog(), cat()];
|std:///util/Eval.rsc|(622,1030,<23,0>,<60,95>): StaticError(
  "Undeclared variable: dog\nAdvice: |http://tutor.rascal-mpl.org/Errors/Static/UndeclaredVariable/UndeclaredVariable.html|",
  |eval:///?command=[*_,%2520cat(),%2520*_]%20:=%20[dog(),%2520cat()];|(20,3,<1,20>,<1,23>))
        at $evalinstance[=11=](|main://$evalinstance[=11=]|)
        at *** somewhere ***(|std:///util/Eval.rsc|(622,1030,<23,0>,<60,95>))
        at eval(|project://AutomatedPuzzleScript/src/PuzzleScript/Test/Engine/EvalExample.rsc|(288,36,<13,31>,<13,67>))
        at $root$(|prompt:///|(0,47,<1,0>,<1,47>)ok
rascal>

据我所知,错误发生在它试图计算模式右侧的狗构造函数时。我正在寻找一种解决方案,使我能够使环境可用于 eval 函数,而无需重新导入 eval 中的所有内容。我这样做的原因是我还没有找到一种动态生成抽象模式的方法,如果有一种方法我会很高兴听到它,因为它是我当前问题的根源。

  • eval 不是 Rascal 中经常使用的函数;您真的需要动态创建模式吗?
  • 有节点模式:(str name)(),在这种情况下,它会匹配任何没有参数的构造函数
  • 真正的答案是,如果您在 eval 调用中执行 import 正确的模块,这些模块将由 eval 函数使用的解释器缓存
  • 这样才不会慢
  • 然而,模块重新加载没有得到很好的支持,您可能必须重新启动 shell 才能将新版本添加到 eval 评估器中。