[英]Building a Clojure app with a command-line interface?
我剛剛開始使用Clojure(來自Ruby),我想用命令行界面構建一個小應用程序。 如何處理CL的輸入/輸出?
我注意到有一個clojure.contrib.command-line,但文檔很小。
以下是使用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?
做了這個boolean?
和b?
標志。
5)最后,我已經指定remaining
捕獲所有剩余的參數而沒有相關的標志。
$ java -classpath . cmd_line_demo -foo test file1 file2 file3
foo: test
bar: 2
boolean?: nil
remaining: [file1 file2 file3]
舊的clojure.contrib.command-line已被tools.cli取代。
https://github.com/clojure/tools.cli
tools.cli曾經被稱為clargon。 下面是兩個博客文章,提供了使用tools.cli的示例(使用tools.cli簡單替換對clargon的任何引用。帖子已過期)。
我想補充一點,你可以做到
(apply -main *command-line-args*)
在(defn -main ...)
下方使其在解釋模式下工作。
問題提出很久之后,我建議在構建CLI界面時使用docopt
庫。 Clojure有一個 - docopt.clj
docopt基於在幫助消息和程序界面描述的手冊頁中使用了數十年的約定。 docopt中的接口描述是這樣的幫助消息,但是已經形式化
因此,您可以聲明您的界面並在同一時間記錄它 - 這很棒且容易做到。
有關詳細信息,我建議您查看http://docopt.org/
還有一個在線應用程序來檢查您的界面http://try.docopt.org/
最后, 這是我的示例如何使用Clojure lib。
也許試試jark。 Jark是一個在持久性JVM上運行clojure程序的工具。 它有一些有用的命令行實用程序。
jark ns load file.clj
jark <namespace>.<function> <args>
jark if cli-json <namespace><function> args
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.