1. ホーム
  2. clojure

[解決済み] コマンドラインインターフェースでClojureアプリを作る?

2023-07-08 08:59:14

質問

私はClojureを始めたばかりで、(Rubyから来た)コマンドラインインターフェイスを持つ小さなアプリを作りたいと思っています。CLへの入出力をどのように処理すればよいですか?

私はclojure.contrib.command-lineがあることに気づいたが、ドキュメントはわずかである。

http://github.com/richhickey/clojure-contrib/blob/ffa868411cda6c617105b52b4f6f9e0f37ee8c24/src/clojure/contrib/command_line.clj

どのように解決するのですか?

以下は、その with-command-line マクロの使用例です。 次のコードは、コマンドライン引数の値を表示する以外何もしない main メソッドを持つ、つまらないクラスを指定しています。

(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? のフラグがあります。

5) 最後に、私が指定した remaining は、関連するフラグを持たない残りのすべての引数を捕捉します。

$ java -classpath . cmd_line_demo -foo test file1 file2 file3
foo:  test
bar:  2
boolean?:  nil
remaining:  [file1 file2 file3]