Rascal从java应用程序访问REPL

Rascal从java应用程序访问REPL,java,integration,rascal,Java,Integration,Rascal,是否有人试图在java可执行文件中的Rascal命令行jar中“链接”并从此java可执行文件调用REPL命令? 我在stackoverflow()上发现了一个类似的问题,但遗憾的是,这并没有深入到细节中 我还查看了“流氓导师”网站,但找不到任何关于如何做到这一点的例子。Tijs告诉我类似于“实例化一个解释器,然后调用import()函数,然后调用call()函数来注入REPL命令”) 是否有任何关于如何执行的示例代码,例如,从REPL上的导师站点,但从java编程上下文而不是命令行上执行以下操

是否有人试图在java可执行文件中的Rascal命令行jar中“链接”并从此java可执行文件调用REPL命令? 我在stackoverflow()上发现了一个类似的问题,但遗憾的是,这并没有深入到细节中

我还查看了“流氓导师”网站,但找不到任何关于如何做到这一点的例子。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
中可以找到同样的实用程序类:

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"));
还有更有效的方法与evaluator交互,通过pdb.values
IValue
接口构建数据和
ICalleableValue
调用Rascal函数。您可以使用上面的heap对象查询其环境以获取对函数的引用,也可以使用低级pdb.values API构建值s传递给这些函数


注意:这段代码是“内部”API,不保证向后兼容。我可以保证这样的事情总是可能的。

以下内容可以解决这个问题;在
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"));
还有更有效的方法与evaluator交互,通过pdb.values
IValue
接口构建数据和
ICalleableValue
调用Rascal函数。您可以使用上面的heap对象查询其环境以获取对函数的引用,也可以使用低级pdb.values API构建值s传递给这些函数

注意:这段代码是“内部”API,不能保证向后兼容。我可以保证这样的事情总是可能的