私はClojureを学んでいます。ディレクトリを再帰的にたどるこのコードを書きました。
(tree-seq #(.isDirectory %1) #(.listFiles %1) (File. "/my-directory"))
.isDirectory
Clojure でファーストクラス関数として使用できないのはなぜですか? このコードを書き直すより良い方法はありますか?
私はClojureを学んでいます。ディレクトリを再帰的にたどるこのコードを書きました。
(tree-seq #(.isDirectory %1) #(.listFiles %1) (File. "/my-directory"))
.isDirectory
Clojure でファーストクラス関数として使用できないのはなぜですか? このコードを書き直すより良い方法はありますか?
Joostは、Javaメソッドがファーストクラスの関数ではないことに注目しています。
これに対処するためのアプローチとして、私は通常、Java関数をClojure関数でラップするのが好きです(またはこれをすでに実行しているライブラリを見つけます)。そうすれば、慣用的なファーストクラスの方法でそれらを簡単に使用できます。
(defn directory? [^java.io.File file]
(.isDirectory file))
(defn list-files [^java.io.File file]
(.listFiles %1))
(tree-seq directory? list-files (File. "/my-directory"))
これはさらに数行のコードですが、次の利点があります。
file-seq (tree-seq を使用)のソースコードを見て、それがどのように機能するかを確認できます。
ところで、あなたのコードは私にとって完璧に機能します。Java クラスを認識できるように、REPL で File の代わりに java.io.File を使用するだけです。
すでに正しい答えが与えられていますが、Clojure の慣用的なコードをもう少し追加するために、私も使用します
#(.foo %)
Joost Diepenmaat が行ったように (しかし、私はそれが見過ごされている可能性があると信じていました)。
Clojure のディレクトリ内のファイルの一覧表示もお勧めします。