在Rascal中引用Java文件

时间:2018-11-08 14:56:36

标签: java rascal

我无法从Rascal引用Java文件。我想在多个线程中进行操作,我不认为Rascal对此提供支持。为了尝试在Rascal中使用Java源代码,我首先尝试重新实现Rascal source code的trim功能。我使用以下乱码:

module thread::threads

@javaClass{thread.JavaThread}
public java str trim(str s);

足够简单。现在,我创建了以下Java文件(基于Rascal source file 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

2 个答案:

答案 0 :(得分:1)

您所做的是正确的。不幸的是,只需要关闭终端并重新打开它,然后再次导入模块,即可将编译后的Java代码绑定到Rascal模块。希望有帮助!

答案 1 :(得分:1)

该异常报告正在寻找的以下方法签名:

thread.JavaThread.runFunctionThreaded(io.usethesource.vallang.IInteger)

这将意味着:

@javaClass{thread.JavaThread}
public java str runFunctionThreaded(int x);

因此,可能是您在玩不同的类和rascal文件。由于类加载器对重新加载类有点敏感,因此可能是您必须在更改Rascal类后重新启动REPL。

不是您的问题,但仍然:看来您正在尝试向Rascal添加多线程,但这是一个很好的主意,Rascal具有全局解释器锁,可以快速停止多线程-线程。当前有此GIL的充分理由,但对于将来,我们可能会放弃该设计。因此,现在,您必须将其保持单线程。