というわけで

イキオイで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で書くとエレガントだと思います。