問題タブ [clojure-java-interop]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票する
1 に答える
575 参照

serialization - gen-classによってClojureでシリアライズ可能なJavaクラスを生成するには?

Clojure によって生成された一連の Java オブジェクトを、Java シリアライゼーション メカニズムによってファイルにシリアライズする必要があります。

上記のように、lancelot.FilterPipe と lancelot.SegmentorPipe のインスタンスはシリアライズする必要があります。オブジェクト ストリームの書き込みは問題ありませんが、コードを再コンパイルすると、オブジェクト ストリームの読み取りが機能しないことがわかりました。

スレッド「Thread-8」での例外 java.io.InvalidClassException: lancelot.SegmentorPipe; ローカル クラスに互換性がありません: ストリーム classdesc serialVersionUID = 2583852145887230781、ローカル クラス serialVersionUID = -2255006751011717591、java.io.ObjectStreamClass.initNonProxy(ObjectStreamClass.java:579)、java.io.ObjectInputStream.readNonProxyDesc(ObjectInputStream.java:1601)、java.io .ObjectInputStream.readClassDesc(ObjectInputStream.java:1514) で java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1750) で java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1347) で java.io.ObjectInputStream.readObject( ObjectInputStream.java:369)

serialVersionUID は static で final であるため、gen-class はインスタンス レベルの final フィールドしか生成できないようです。問題は、生成されたクラスに特定の serialVersionUID を設定できないことです。

問題に対するアドバイスはありますか?前もって感謝します。

0 投票する
1 に答える
448 参照

scala - java/scala 経由でベクトル/入力ストリームを clojure 関数に渡す

最初の引数としてベクトルまたは入力ストリームを期待する java/scala から clojure-function を呼び出す必要があります。

これを行うと、常に次の例外が発生します。

実行例外[[UnsupportedOperationException: pdf (clj-pdf.main/-pdfが定義されていませんか?)]]

clj-pdfを使用しており、pdf-function を呼び出す必要があります

ソースを変更し、jarを作成しました

cjl-pdf の project.clj への変更は、最後の 2 行で確認できます。

そして追加したmain.cljで:

次のように、scala コードから lib を使用しています。

これを回避する方法はありますか?

0 投票する
2 に答える
279 参照

clojure - Java リフレクションで認識できるように Clojure 関数にタグを付ける方法

Javaコードがリフレクションを使用してClojure関数を「特別」として認識できるように、何らかの方法で特定のClojure関数にタグを付ける必要があります。関数に注釈を追加しようとしましたが、サポートされていないようです。reify(Java コードが関数オブジェクトを認識できるように)インターフェースの拡張を試みましたIFnが、Clojure は具体化されたメソッドを を実装するコードとして直接使用するのinvokeではなく、Afunction実際にメソッドを実装します (invoke実際の関数コードで実際のメソッドにタグを付ける必要があります)。

何か案は?

編集:(通常のリフレクションではなく)ASMライブラリでアクセスできる方法でタグ付けしても問題ありませんが、実際のAFunctionオブジェクトまたはinvokeメソッドに何らかの形でタグ付けする必要があります。また、実際のAFunctionオブジェクトにアクセスできません。クラスでタグを表示する必要があります。

0 投票する
1 に答える
304 参照

casting - 整数型キャストはJava相互運用でどのように機能しますか?

ルールを理解できませんでした。

0 投票する
3 に答える
151 参照

clojure - clojureコンパイラによって生成されたバイトコードで「public static {}」とはどういう意味ですか?

clojure で ( gen-classを使用して) クラスを生成すると、 javapを介して検査すると、次の定義が得られます。

私はこれまでにこのようなものを見たことがなかったので、コンストラクトpublic static {}が何を意味するのだろうか…</p>

誰かが私を啓発してもらえますか?

0 投票する
3 に答える
1367 参照

clojure - Java列挙型でClojureのケースフォームを使用することは可能ですか?

ドクターcase曰く

cond や condp とは異なり、case は一定時間のディスパッチを行います... case ではあらゆる種類の定数式が受け入れられます。

caseの定数時間ディスパッチを利用して、Java 列挙型に一致させたいと考えています。Java のswitchステートメントは列挙型でうまく機能しますが、Clojure では次のようにします。

結果:IllegalArgumentException No matching clause: MILLISECONDS

では列挙型はサポートされていませんcaseか? 私は何か間違ったことをしていますか?頼る必要condがありますか、それともより良い解決策がありますか?