ISeq などは Java であることに注意してください。
Clojure では、seq の抽象化は、最初の関数、残りの関数、および n 番目の関数に提供できる単なる「何か」です (seq で最初に呼び出すのではなく、seq 引数を使用して最初に呼び出すことに注意してください)。Clojure 言語のコア関数はすべて、コレクション、seq、またはプリミティブ型で動作します。公開されたインターフェイスのメソッドにバンドルされたデータはありません。したがって、Clojure の実装は Java で行われ、JVM とのすべての相互運用性にはクラス/オブジェクトが関与しますが、Clojure 言語自体は関与しません。
メソッドをデータ構造にバンドルすることは、Clojure が思いとどまらせることです。
そうは言っても...現実には、関数には、どの引数を使用するかについて制限があります。first rest と nth は、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