Rascal 从 java 应用程序访问 REPL

Rascal access the REPL from a java application

有没有人试图在 java 可执行文件的 Rascal 命令行 jar 中 "link" 并从此 java 可执行文件调用 REPL 命令? 我在 Whosebug () 上发现了一个类似的问题,但不幸的是没有详细说明。

我还查看了 Rascal 导师网站,但找不到有关如何执行此操作的任何示例。 Tijs 告诉我,这类似于“实例化一个解释器,然后调用 import() 函数,之后可以调用 call() 函数来注入 REPL 命令。

是否有关于如何操作的示例代码,例如以下内容来自 REPL 上的导师站点,但来自 java 编程上下文而不是命令行:

rascal>import demo::lang::Exp::Concrete::NoLayout::Syntax;
ok
rascal>import ParseTree;
ok
rascal>parse(#Exp, "2+3");
sort("Exp"): `2+3`

以下方法可以解决问题;可以在 rascal/src/org/rascalmpl/interpreter/JavaToRascal.java:

中找到相同的实用程序 class
GlobalEnvironment heap = new GlobalEnvironment();
IValueFactory vf = ValueFactoryFactory.getValueFactory();
TypeFactory TF = TypeFactory.getInstance();
IRascalMonitor mon = new NullRascalMonitor();
Evaluator eval = new Evaluator(vf, new PrintWriter(System.err), new PrintWriter(System.out), new ModuleEnvironment(ModuleEnvironment.SHELL_MODULE, heap), heap);


eval.doImport(mon, "demo::lang::Exp::Concrete::NoLayout::Syntax");
eval.doImport(mon, "ParseTree");
eval.eval(mon, "parse(#Exp, \"2+3\");", URIUtil.rootLocation("unknown"));

还有更有效的方式与计算器交互,通过 pdb.values IValue 接口构建数据和 ICalleableValue 调用 Rascal 函数。您可以使用上面的堆对象查询其环境以获取对函数的引用,您可以使用低级别 pdb.values API 构造值以传递给这些函数。

注意买者:此代码 "internal" API 不保证向后兼容。我可以保证这样的事情永远是可能的。