在 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 有很好的理由,但未来我们可能会放弃这种设计。所以现在,你必须保持单线程。
我无法从 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 有很好的理由,但未来我们可能会放弃这种设计。所以现在,你必须保持单线程。