【问题标题】:Rascal access the REPL from a java applicationRascal 从 Java 应用程序访问 REPL
【发布时间】:2015-09-02 15:26:13
【问题描述】:

有没有人试图在 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`

【问题讨论】:

    标签: java integration rascal


    【解决方案1】:

    以下方法可以解决问题;可以在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,不保证向后兼容性。我可以保证这样的事情永远都是可能的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-03
      • 2013-10-26
      • 2023-03-20
      • 1970-01-01
      相关资源
      最近更新 更多