clojureで簡易grepコマンドを作ってみる。

必要なこと

  • ファイルの読み込み方(できればseqで取り出したい)
    • clojure.contrib.duck-streamsのread-linesとreaderを使えばいい。
  • 正規表現の使い方
    • re-find,re-pattern
  • .classファイルの生成の仕方
    • (compile )

code

;;file:tgrep.clj
(ns tgrep
  (:gen-class)
  (:use [clojure.contrib.duck-streams :only (reader read-lines)]))

(defn grep "extract mathed line from file"
  [re file]
  (filter #(re-find re %) (read-lines (reader file))))

(defn -main [& args]
  (let [rx (first args), files (rest args)] 
    (doseq [file files]
      (doseq [line (grep (re-pattern rx) file)] (println line)))))  

compile

;;*compile-path*が存在しないとだめ
;;class-pathからtgrep.cljが読み取れないとだめ
(compile 'tgrep)

実行

java -cp ./classes:**/clojure.jar:**/clojure-contrib.jar <regexp> <file> ...