8

結果のシーケンスを表す Java クラスを使用しています (Clojure ベクトルのようなものです)。

このクラスを典型的な Clojure シーケンス関数で使用したい (つまり、シーケンスの抽象化をサポートしているかのようにクラスを動作させたい) のですが、クラスを変更できないため、実装することはできませんclojure.lang.Seqable。また、厄介なことに、このクラスはjava.util.Collectionorを実装していませんjava.lang.Iterable

いくつかのオプションが表示されます:

  • iterator-seqオブジェクトの (既存の) イテレータで使用します。
  • java.util.Collection/を実装する別のクラスでオブジェクトをラップするclojure.lang.Sequable
  • オブジェクトを照会して Clojure ベクターまたはシーケンスを構築する関数を作成する

他のオプションはありますか?最善のアプローチは何ですか?

4

3 に答える 3

6

proxyクラスを拡張して実装させるために使用しますISeq

于 2012-10-19T06:24:41.610 に答える
6

を使用するのが最も速くて簡単iterator-seqです。

これは疑問を投げかけます:なぜClojureのコアは、によって呼び出されるSeqSourceのようなプロトコルを提供しないのですかseq? 次に、非標準コレクションを「拡張」して seq を提供できます。これは、InternalReduce がreduce.

于 2012-10-19T03:31:23.547 に答える
2

私の最初のショットは、そのオブジェクトの遅延シーケンスを作成することです。

(defn sequify [obj]
  (letfn [(inner [idx] 
                 (when (< idx (.size obj))
                          (cons (.get obj idx)
                                (lazy-seq 
                                  (inner (inc idx))))))]
    (inner 0)))

.sizeand.getを適切なメソッドに置き換えるだけです。

ソリューションと比較してパフォーマンスを向上させたい場合は、ラッパーを作成する方が適切な場合がありますlazy-seq

于 2012-10-19T12:30:08.290 に答える