私は最近 Clojure (Ruby から移行) を使い始めましたが、コマンドライン インターフェイスを備えた小さなアプリを構築したいと考えています。CL への入出力をどのように処理すればよいでしょうか?
clojure.contrib.command-line があることに気づきましたが、ドキュメントが乏しいです。
ベストアンサー1
以下はそのマクロの使用例ですwith-command-line
。次のコードは、コマンドライン引数の値を出力するだけのメイン メソッドを持つ単純なクラスを指定します。
(ns cmd-line-demo
(:gen-class)
(:use clojure.contrib.command-line))
(defn -main [& args]
(with-command-line args
"Command line demo"
[[foo "This is the description for foo" 1]
[bar "This is the description for bar" 2]
[boolean? b? "This is a boolean flag."]
remaining]
(println "foo: " foo)
(println "bar: " bar)
(println "boolean?: " boolean?)
(println "remaining: " remaining)))
REPL でクラスをコンパイルします。
user> (compile 'cmd-line-demo)
cmd-line-demo
使用例
1) コマンドライン引数なしで実行すると、ヘルプ情報が表示されます。ヘルプ情報は、--help
または-h
フラグを使用して表示することもできます。ヘルプ情報は cmdspec から自動的に生成されることに注意してください。
$ java -classpath . cmd_line_demo
Command line demo
Options
--foo <arg> This is the description for foo [default 1]
--bar <arg> This is the description for bar [default 2]
--boolean, -b This is a boolean flag.
2) 指定されていない引数は、cmdspec バインディングで指定されたデフォルト値を受け取ります。たとえば、bar
のデフォルト値は です2
。
$ java -classpath . cmd_line_demo --foo "changed value"
foo: changed value
bar: 2
boolean?: nil
remaining: []
3) ブールフラグは、cmdspec の接尾辞「?」で示されます。フラグ自体はない名前の一部に「?」を含めます。
$ java -classpath . cmd_line_demo -boolean
foo: 1
bar: 2
boolean?: true
remaining: []
4) また、cmdspec で複数のシンボルを指定することにより、フラグのエイリアスを指定できることにも注意してください。私は、boolean?
およびb?
フラグを使用してこれを実行しました。
remaining
5) 最後に、関連するフラグなしで残りのすべての引数をキャプチャするように指定しました。
$ java -classpath . cmd_line_demo -foo test file1 file2 file3
foo: test
bar: 2
boolean?: nil
remaining: [file1 file2 file3]