最近のClojureだったらtools.cljを使うほうが良いようです。
tools.cli: Clojureでコマンドライン引数を扱う - Qiita [キータ]
Clojureでコマンドラインアプリを作るときに便利なマクロを見つけたので、使い方をメモっておきます。
clojure.contrib.command-line/with-command-lineを使うと、コマンドラインでオプションを受け取る処理をスッキリ書けます。
何はなくともまず例示、ということで整数計算するスクリプトをwith-command-lineを使って書いてみたのがこれです。
gist: 770487 - GitHub
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
; int-calc.clj | |
(ns int-calc | |
(:use [clojure.contrib.command-line :only (with-command-line)])) | |
(with-command-line *command-line-args* | |
"clj int-calc.clj [-p|-mi|-ml] [-modulo n] nums.." | |
[[plus? p? "plus" true] | |
[minus? mi? "minus"] | |
[multiply? ml? "multiply"] | |
[modulo "mod n"] | |
num-strs] | |
(let [nums (map #(Integer/parseInt %) num-strs) | |
func (cond | |
plus? + | |
minus? - | |
multiply? *) | |
result (reduce func nums)] | |
(if (nil? modulo) | |
(println result) | |
(println (mod result (Integer/parseInt modulo)))))) | |
option?のように?を付けると真偽値、?無しだと引数をその変数名で受け取ってくれます。オプションの省略記法も一緒に定義。オプション説明のあとに値を指定するとデフォルト値を設定してくれます。
これを実行するとこんな感じになります。自動でhelpオプションを表示してくれるのも気が利いてる。
$ clj int-calc.clj -p 3 5 8 $ clj int-calc.clj 3 5 8 $ clj int-calc.clj -p 3 5 -modulo 2 0 $ clj int-calc.clj -ml 3 5 15 $ clj int-calc.clj -ml 3 5 -modulo 2 1 $ clj int-calc.clj --help clj int-calc.clj [-p|-mi|-ml] [-modulo n] nums.. Options --plus, -p plus [default true] --minus, --mi minus --multiply, --ml multiply --modulomod n
こういう定型処理をサクっと分かりやすく書けるのは良いですね。
これに限らずclojure.contribライブラリには便利なものが揃ってて良いんですが、全体の量が多いしドキュメント読んだだけだと使い方がわからないことがちらほら。コーディングしてて「おー、なかなか気の利いたコードが書けたぜ!」と思ってたら、あとでライブラリにもっとエレガントな実装を見つけて凹むみたいなケースが何件かありました(text2epub-cljのcore.cljもこれで書き直した)。
日本語情報が少ないというのも良くない再発明をしちゃう原因のひとつかなーと思うので、こういう便利なのを見つけたらちょこちょこ書いていこうと思います。
【参考】
Building a Clojure app with a command-line interface? - Stack Overflow
Clojure関連質問サイト。英語情報で良ければかなり充実。
逆引きClojure
日本語情報だとこちら。こっちにも書きこんでますよ。