我在引用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错误。
如何在trim文件中调用JavaThread方法?
发布于 2018-11-08 15:50:57
你所做的是对的。它只需要关闭终端并重新打开它,然后再次导入模块,不幸的是,将编译后的Java代码绑定到Rascal模块。希望这能帮上忙!
发布于 2018-11-08 15:51:08
异常报告它正在寻找的以下方法签名:
thread.JavaThread.runFunctionThreaded(io.usethesource.vallang.IInteger)这意味着:
@javaClass{thread.JavaThread}
public java str runFunctionThreaded(int x);所以可能是你在玩不同的类和流氓文件。由于类加载器对重新加载类有点敏感,所以在Rascal类更改后,您可能不得不重新启动REPL。
不是你的问题,但仍然是:看起来你试图添加多线程到Rascal,虽然这是一个非常好的想法,Rascal有一个全局解释器锁,并迅速停止多线程。目前有很好的理由来这个GIL,但对于未来,我们可能会离开那个设计。因此,现在,您必须保持它的单线程。
https://stackoverflow.com/questions/53210300
复制相似问题