[英]Referencing a Java file in Rascal
我在從Rascal引用Java文件時遇到麻煩。 我想在多個線程中進行操作,我不認為Rascal對此提供支持。 為了嘗試在Rascal中使用Java源代碼,我首先嘗試重新實現Rascal源代碼的trim功能。 我使用以下亂碼:
module thread::threads
@javaClass{thread.JavaThread}
public java str trim(str s);
很簡單。 現在,我創建了以下Java文件(基於Rascal源文件Prelude.java ):
package thread;
import io.usethesource.vallang.IString;
import io.usethesource.vallang.IValueFactory;
public class JavaThread {
protected final IValueFactory values;
public JavaThread(IValueFactory values){
super();
this.values = values;
}
public IString trim(IString s) {
return values.string(s.getValue().trim());
}
}
可悲的是,運行此命令將導致以下錯誤:
rascal>import thread::threads;
|project://Software_Evolution/src/thread/threads.rsc|(42,58,<4,0>,<5,28>): No such Java method: thread.JavaThread.trim(io.usethesource.vallang.IString)
Advice: |http://tutor.rascal-mpl.org/Errors/Static/UndeclaredJavaMethod/UndeclaredJavaMethod.html|
但是,似乎正確引用了Java文件,因為稍微更改此名稱將為Cannot link method thread.JavaThreads because: class not found
錯誤。
如何在JavaThread
文件中調用方法trim
?
你做的是對的。 不幸的是,只需要關閉終端並重新打開它,然后再次導入模塊,即可將編譯后的Java代碼綁定到Rascal模塊。 希望有幫助!
異常報告正在尋找的以下方法簽名:
thread.JavaThread.runFunctionThreaded(io.usethesource.vallang.IInteger)
這意味着:
@javaClass{thread.JavaThread}
public java str runFunctionThreaded(int x);
因此,可能是您在玩不同的類和無賴文件。 由於類加載器對重新加載類有點敏感,因此可能是您必須在更改Rascal類后必須重新啟動REPL。
不是您的問題,但仍然是:看來您正在嘗試向Rascal添加多線程,但這是一個很好的主意,Rascal具有全局解釋器鎖,並且可以快速停止多線程。 當前有此GIL的充分理由,但對於將來,我們可能會放棄該設計。 因此,現在,您必須使其保持單線程。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.