というわけで
イキオイでquicksilverならぬclojure-silver.cljをば。
(use 'clojure.contrib.duck-streams 'clojure.contrib.str-utils 'clojure.contrib.shell-out) ;clojureでquicksilver的なもの ;ひとつだけだったら起動。複数だったら候補を表示して終了 (defn get-apps [] (letfn [(gap [lst] (lazy-seq (if-let [l (first lst)] (cons l (gap (rest lst))) )))] (filter #(re-seq #"\.app$" (. % getName)) (gap (. (file-str "/Applications") listFiles))))) (def apps (map #(. % getName) (get-apps))) (defn find-app [fname] (let [app-name fname app (filter #(re-seq (re-pattern app-name) %) apps)] ;;NOTE:CASE_INSENSITIVE? (if (= 0 (count app)) '() app))) (defn do-or-exec [app-seq] (cond (empty? app-seq) (println "application not found") (== (count app-seq) 1) (sh "open" "-a" (first app-seq)) (> (count app-seq) 1) (println (str-join "\n" (cons "some applications exist: " app-seq))))) (defn main [filename] (letfn [(get-app [f] (if (nil? f) (println "no args") (do-or-exec (find-app f))))] (get-app filename))) (main (first *command-line-args*))
java.util.regex.PatternのCASE_INSENSITIVEをいじりたいんだけど、javaからいじらないとダメなのかはいまんとこ不明。swingなりでguiつけてあげればアプリっぽくはなりそうですよね。
いまのじぶんだとgrocessing(groovy+p5)でガワだけつくって、ウラでclojureからアプリの遅延シーケンスひっぱってというかたちのほうが早くつくれそう。もつのろんclojureなバックエンドは並列処理で/Applicationsを掘るものとgroovyからアクセスできるものをうごかすかたちで。現状は/Applications直下のものしか掘らないので、どのくらいの深さまでappを見つけにいくかもclojureで書くとエレガントだと思います。