有没有人试图"链接"在java可执行文件中的Rascal命令行jar中,从这个java可执行文件中调用REPL命令? 我在stackoverflow(Running a Rascal program from outside the REPL)上发现了一个类似的问题,但不幸的是,这并没有详细说明。
我还检查了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`
答案 0 :(得分:0)
以下可以解决问题;可以在rascal/src/org/rascalmpl/interpreter/JavaToRascal.java
:
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来构造值以传递给这些函数。
警告:这段代码是“内部”API,不保证向后兼容。我可以保证这样的事情永远都是可能的。