問題タブ [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.
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 を設定できないことです。
問題に対するアドバイスはありますか?前もって感謝します。
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 を使用しています。
これを回避する方法はありますか?
clojure - Java リフレクションで認識できるように Clojure 関数にタグを付ける方法
Javaコードがリフレクションを使用してClojure関数を「特別」として認識できるように、何らかの方法で特定のClojure関数にタグを付ける必要があります。関数に注釈を追加しようとしましたが、サポートされていないようです。reify
(Java コードが関数オブジェクトを認識できるように)インターフェースの拡張を試みましたIFn
が、Clojure は具体化されたメソッドを を実装するコードとして直接使用するのinvoke
ではなく、Afunction
実際にメソッドを実装します (invoke
実際の関数コードで実際のメソッドにタグを付ける必要があります)。
何か案は?
編集:(通常のリフレクションではなく)ASMライブラリでアクセスできる方法でタグ付けしても問題ありませんが、実際のAFunction
オブジェクトまたはinvoke
メソッドに何らかの形でタグ付けする必要があります。また、実際のAFunction
オブジェクトにアクセスできません。クラスでタグを表示する必要があります。
casting - 整数型キャストはJava相互運用でどのように機能しますか?
ルールを理解できませんでした。
clojure - clojureコンパイラによって生成されたバイトコードで「public static {}」とはどういう意味ですか?
clojure で ( gen-classを使用して) クラスを生成すると、 javapを介して検査すると、次の定義が得られます。
私はこれまでにこのようなものを見たことがなかったので、コンストラクトpublic static {}が何を意味するのだろうか…</p>
誰かが私を啓発してもらえますか?
clojure - Java列挙型でClojureのケースフォームを使用することは可能ですか?
ドクターcase
曰く
cond や condp とは異なり、case は一定時間のディスパッチを行います... case ではあらゆる種類の定数式が受け入れられます。
case
の定数時間ディスパッチを利用して、Java 列挙型に一致させたいと考えています。Java のswitch
ステートメントは列挙型でうまく機能しますが、Clojure では次のようにします。
結果:IllegalArgumentException No matching clause: MILLISECONDS
では列挙型はサポートされていませんcase
か? 私は何か間違ったことをしていますか?頼る必要cond
がありますか、それともより良い解決策がありますか?