[英]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.