Clojureでコマンドライン引数パースめも

tools.cliを用いれば簡単にできる。

導入

  • project.clj の :dependencies に以下を追記
[org.clojure/tools.cli "0.2.2"]

利用例

  • use に以下を追加
[clojure.tools.cli :only (cli)]
  • main関数の実装例
(defn -main [& args]
  (let [[options extra-args banner]
        (cli args
             ["-p" "--port"          "Listen on this port" :default 9999 :parse-fn #(Integer. %)] 
             ["-h" "--host"          "The hostname"        :default "localhost"]
             ["-v" "--[no-]verbose"  "Verbose"             :default true]
             ["-h" "--help"          "Show Help"           :flag true])]
    (if (:help options) (println banner) ; ヘルプオプションが指定された場合はbannerを表示して終了
        (my-function (:port options)     ; そうでない場合は、各オプションとオプション以外の引数を渡して主処理実行
                     (:host options)
                     (:verbose options)
                     extra-args))))
  • 実行例
lein run -- --help
;=>
;Usage:
;
; Switches                     Default     Desc
; --------                     -------     ----
; -p, --port                   9999        Listen on this port
; -h, --host                   localhost   The hostname
; -v, --no-verbose, --verbose  true        Verbose
; -h, --no-help, --help        false       Show Help

lein uberjar
java -jar target/該当のjar --help
;=> (同上)

lein repl
(use :reload 'myapp.core)
(-main "--help")
;=> (同上)

補足

  • cli 関数の戻り値は options extra-args banner からなるベクタ
    • options コマンドオプション部分をパースしてマップにしたもの
    • extra-args コマンドオプション以外の引数のベクタ
    • banner ヘルプ表示用の整形された文字列