在 Rascal 中引用 Java 文件

Referencing a Java file in 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 错误。

如何在 JavaThread 文件中调用方法 trim

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

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

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

这意味着:

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

所以您可能在玩不同的 classes 和 rascal 文件。由于 class 加载程序对重新加载 classes 有点敏感,可能是你必须在 Rascal class.

发生变化后重新启动 REPL

不是你的问题,但仍然:看起来你正在尝试向 Rascal 添加多线程,虽然这是一个很好的主意,Rascal 有一个全局解释器锁并迅速停止多线程。目前这个 GIL 有很好的理由,但未来我们可能会放弃这种设计。所以现在,你必须保持单线程。