ISEQのようなものは、Javaであることに注意してください。
Clojureでは、seq抽象化は実際には、最初、残り、およびn番目の関数に供給できる(何かをseqで最初に呼び出すのではなく、最初にseq引数を指定します)。 Clojure言語のコア関数は、すべてコレクション、seqs、またはプリミティブ型で動作します。公開されたインタフェースには、メソッドにバンドルされたデータはありません。したがって、Clojureの実装はJavaであり、JVMとのすべての相互運用はクラス/オブジェクトを伴いますが、Clojure自体はそうではありません。
データ構造を含むバンドル方法は、Clojureが嫌うものです。
実際には、機能にはどのような議論が機能するかに限界があります。最初の残りの部分とn番目の部分は、seqになる可能性のあるものでのみ動作します。このような観点から、データ構造がメソッドと一緒にバンドルされているかどうかにはあまり差はありません。それでも正しく一致させる必要があります。大きな勝利は柔軟性から来ています。関数は、引数を取ってクラスを定義せずに上位関数で構成することができます。
(def farms [{:name "Swansea", :value 100}
{:name "Broadmarsh", :value 200, :produce [:corn :wheat :rye]}
{:name "Snug", :value 50, :animals [:goats :pigs]}])
(reduce + (map :value farms))
-> 350
(reduce + (map :value (filter :animals farms)))
-> 50
「オブジェクト指向ではないと報告されている」ソースへのリンクは、技術対政治です... –
http://clojure.org/rationale OOPとClojureがそれを避ける理由について話しています。 –
http://blog.thinkrelevance.com/2009/8/12/rifle-oriented-programming-with-clojure-2は、Clojureがどのように実際にすべての主要なOOプリンシパルの使用を許可するかを説明する興味深い記事です。しかし、私はそれらを組み合わせることは困難であることがわかります。例えば、クロージャーカプセル化を使用すると、継承による拡張が除外されます。一般的なアプローチは、拡張性のためにカプセル化を放棄することであるように思われる。 –