簡體   English   中英

Rascal從Java應用程序訪問REPL

[英]Rascal access the REPL from a java application

是否有人嘗試在Java可執行文件的Rascal命令行jar中“鏈接”並從該Java可執行文件調用REPL命令? 我在stackoverflow上發現了類似的問題( 從REPL外部運行Rascal程序 ),但是不幸的是,這沒有涉及到細節。

我還檢查了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找到相同的實用程序類:

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,不能保證向后兼容。 我可以保證這樣的事情將永遠是可能的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM