簡體   English   中英

在Rascal中引用Java文件

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM