首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >引用Rascal中的Java文件

引用Rascal中的Java文件
EN

Stack Overflow用户
提问于 2018-11-08 14:56:35
回答 2查看 193关注 0票数 1

我在引用Rascal的Java文件时遇到了问题。我想在多个线程中执行一个操作,我不认为Rascal支持这个操作。为了尝试在Rascal中使用Java源代码,我首先尝试重新实现Rascal源代码的trim函数。我使用以下流氓代码:

代码语言:javascript
复制
module thread::threads

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

很简单。现在,我创建了以下Java文件(基于Rascal源文件Prelude.java):

代码语言:javascript
复制
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());
    }
}

不幸的是,运行此操作会导致以下错误:

代码语言:javascript
复制
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方法?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-11-08 15:50:57

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

票数 1
EN

Stack Overflow用户

发布于 2018-11-08 15:51:08

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

代码语言:javascript
复制
thread.JavaThread.runFunctionThreaded(io.usethesource.vallang.IInteger)

这意味着:

代码语言:javascript
复制
@javaClass{thread.JavaThread}
public java str runFunctionThreaded(int x);

所以可能是你在玩不同的类和流氓文件。由于类加载器对重新加载类有点敏感,所以在Rascal类更改后,您可能不得不重新启动REPL。

不是你的问题,但仍然是:看起来你试图添加多线程到Rascal,虽然这是一个非常好的想法,Rascal有一个全局解释器锁,并迅速停止多线程。目前有很好的理由来这个GIL,但对于未来,我们可能会离开那个设计。因此,现在,您必须保持它的单线程。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53210300

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档