我刚开始学习Clojure(来自Ruby),想用命令行界面构建一个小应用程序。如何处理与命令行的输入/输出?
我注意到有clojure.contrib.command-line,但是文档非常简洁。
我刚开始学习Clojure(来自Ruby),想用命令行界面构建一个小应用程序。如何处理与命令行的输入/输出?
我注意到有clojure.contrib.command-line,但是文档非常简洁。
下面是使用其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
标志来显示帮助信息。请注意,帮助信息是根据您的命令规范自动生成的。
$ 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) 未指定的参数将接收命令规范绑定中指定的默认值。例如,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]
clojure.contrib.command-line已被tools.cli所取代。
https://github.com/clojure/tools.cli
tools.cli曾被称为clargon。以下是两篇博客文章,介绍了如何使用tools.cli(请将任何对clargon的引用简单地改为tools.cli。这些文章已过时)。
我想补充一点,你可以这样做
(apply -main *command-line-args*)
在(defn -main ...)
下面添加内容以使其在解释模式下工作。
在提出问题很久之后,我可以建议在构建CLI界面时使用docopt
库。对于Clojure,有一个叫做docopt.clj
的库。
docopt基于用于程序接口描述中帮助消息和手册页中几十年来使用的约定。在docopt中,接口描述就是这样一条帮助消息,但是已经形式化了。
因此,您可以同时“声明”您的接口并记录它 - 这非常惊人且易于操作。
有关更多详细信息,请查看http://docopt.org/。
另外还有一个在线应用程序可用于检查您的接口http://try.docopt.org/。
最后,这是我的一个示例,演示了如何使用Clojure库。
或许可以尝试使用Jark。 Jark是一个在持久化JVM上运行Clojure程序的工具。它还有一些实用的命令行工具。
jark ns load file.clj
jark <namespace>.<function> <args>
jark if cli-json <namespace><function> args