我刚开始使用Clojure(来自Ruby),我想用命令行界面构建一个小型应用程序。如何处理CL的输入/输出?
我注意到有一个clojure.contrib.command-line,但是文档很薄。
我刚开始使用Clojure(来自Ruby),我想用命令行界面构建一个小型应用程序。如何处理CL的输入/输出?
我注意到有一个clojure.contrib.command-line,但是文档很薄。
Answers:
这是使用其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]
旧的clojure.contrib。命令行已替换为tools.cli。
https://github.com/clojure/tools.cli
tools.cli以前称为clargon。以下是两个博客文章,这些文章提供了使用tools.cli的示例(简单地将对clargon的引用替换为tools.cli。这些帖子已过时)。
提出问题很长时间后,我可以建议使用docopt
库来构建CLI界面。Clojure有一个-docopt.clj
docopt基于数十年来在帮助消息和手册页中用于程序界面描述的约定。docopt中的接口描述就是这样的帮助消息,但是形式化了
因此,您可以同时声明您的接口并对其进行文档化-这非常了不起且容易实现。
有关更多详细信息,我建议检查http://docopt.org/
另外,还有一个在线应用程序可以检查您的界面http://try.docopt.org/
最后,这是我的示例,如何使用Clojure库。
也许尝试一下。Jark是在持久性JVM上运行clojure程序的工具。它具有一些有用的命令行实用程序。
jark ns load file.clj
jark <namespace>.<function> <args>
jark if cli-json <namespace><function> args