3

私はClojureを学んでいます。ディレクトリを再帰的にたどるこのコードを書きました。

(tree-seq #(.isDirectory %1) #(.listFiles %1) (File. "/my-directory"))

.isDirectoryClojure でファーストクラス関数として使用できないのはなぜですか? このコードを書き直すより良い方法はありますか?

4

4 に答える 4

7

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"))

これはさらに数行のコードですが、次の利点があります。

  • 反射を避けるために関数にタイプヒントを追加できます(上記のように)
  • 最終的なコードはよりクリーンで慣用的です
  • 基盤となるJava相互運用機能から抽象化しました
于 2012-11-05T11:24:49.610 に答える
1

file-seq (tree-seq を使用)のソースコードを見て、それがどのように機能するかを確認できます。

ところで、あなたのコードは私にとって完璧に機能します。Java クラスを認識できるように、REPL で File の代わりに java.io.File を使用するだけです。

于 2012-11-05T09:51:25.703 に答える
1

すでに正しい答えが与えられていますが、Clojure の慣用的なコードをもう少し追加するために、私も使用します

#(.foo %)

Joost Diepenmaat が行ったように (しかし、私はそれが見過ごされている可能性があると信じていました)。

Clojure のディレクトリ内のファイルの一覧表示もお勧めします。

于 2012-11-05T20:56:59.407 に答える