file-seqについて

さっき下書きのつもりで試しつつ記事書いてたんですが途中で重大な間違いをしてたので消しました。
とりあえずfile-seqが再帰して下位ディレクトリまで掘るのが気にくわないなーと思ったので、どうやればいいか的な話だったのですが。

つか「そういやfilterって遅延シーケンスを返すじゃん! 」ってことにさっき気がつきました。さっきのさっきまで一生懸命file-seqからlazy-seqつくってたっていう… バカですね。

とりあえずなんですけど自分のやりたいことは/Applications以下にあるappファイルの遅延シーケンスが欲しいってことだったので、こんなかんじでできました的な話です。

(defn get-apps
  ([] (concat [] (get-apps (. (file-str "/Applications") listFiles))))
  ([lzsq]
   (if-let [apps (filter #(re-seq #"\.app$" (. % getName)) lzsq)]
     (lazy-seq
       (cons (first apps) (get-apps (rest apps)))))))

こんなん定義してあげて

(println (take 10 (get-apps)))

とかしてあげればこんなん返ります。

(#<File /Applications/Address Book.app> #<File /Applications/Adium.app> #<File /Applications/Adobe Media Player.app> #<File /Applications/AppCleaner.app> #<File /Applications/Automator.app> #<File /Applications/BetterTouchTool.app> #<File /Applications/Calculator.app> #<File /Applications/Carbon Copy Cloner.app> #<File /Applications/Chess.app> #<File /Applications/Cyberduck.app>)

ちなみにadobeさんのアプリケーションを入れてると、奥底のほうにあるappがシンボリックリンクをはっていてfile-seqでひっぱるととんでもないことになります。なのでこんなのも一応書きました。↑のやりかたでとりあえずってかんじだったので使いませんでしたが。

(defn is-symbolic? [file]
  (let [abs-path (. file getAbsolutePath)
        cano-path (. file getCanonicalPath)]
    (if (= abs-path cano-path) 
      false
      true)))

つかこんなもの自体も探せば意外とclojure.contribとかにあったりして。