【发布时间】:2015-04-14 18:43:11
【问题描述】:
我真的很希望能够从 REPL 外部运行一些 Rascal 的程序(例如,作为脚本的一部分,或从另一个程序调用)。我使用 Rascal 是在一个更大的框架中的中间阶段,所以我想知道从另一个程序集成执行 Rascal 代码的最佳方法是什么。
【问题讨论】:
标签: rascal
我真的很希望能够从 REPL 外部运行一些 Rascal 的程序(例如,作为脚本的一部分,或从另一个程序调用)。我使用 Rascal 是在一个更大的框架中的中间阶段,所以我想知道从另一个程序集成执行 Rascal 代码的最佳方法是什么。
【问题讨论】:
标签: rascal
目前最好的方法是将您的代码与 Rascal shell 可执行 jar 打包在一起。有一个方便类JavaToRascal 用于调用 Rascal 代码。有时需要考虑使用IRascalSearchPathContributors 将您自己的模块添加到 Rascal 搜索路径,但如果您包含具有正确属性的 RASCAL.MF 文件,这一切都应该自动进行。
如果您正在考虑使用 Eclipse 插件,那么最好的方法是让您的插件依赖于 rascal-eclipse 插件并使用ProjectEvaluatorFactory 来访问解释器。
警告:由于我们正在转向编译系统,因此您为这种集成编写的代码将会改变。这就是我们尚未记录从 Java 调用 Rascal 的 API 的原因。
【讨论】:
当我在思考同一个问题时,这是我想出的(也许是微不足道的)答案:
java -jar /path/to/rascal-shell-stable.jar path/to/myProgram.rsc
你必须知道 Rascal 从当前目录计算模块名称(不知道它是否支持 Java 的 CLASS_PATH 之类的东西),所以在上面的例子中 myProgram.rsc 应该有一个模块声明 module path::to::myProgram。计算和声明的模块名称必须匹配。
【讨论】:
META-INF/RASCAL.MF 的目录中那样启动REPL(也可以通过向上移动目录树),那么解释器将使用正确的搜索路径配置自己。警告;您必须使用-cp 在JVM 的类路径上提供除stdlib 之外的任何库。所以-jar 选项将不起作用。然后,您需要传递主类 org.rascalmpl.shell.RascalShell 以及 -cp 类路径。如果你有一个 mvn 项目,这些东西会在即将到来的稳定版本中使用 mvn rascal:console 为你自动完成。