用命令行界面构build一个Clojure应用程序?

我刚开始使用C / C ++(来自Ruby),我想用命令行界面构build一个小应用程序。 如何处理input/输出到CL?

我注意到有一个clojure.contrib.command线,但文件很苗条。

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

这是一个使用它with-command-linemacros的例子。 下面的代码用一个主要的方法指定一个普通的类,它只是打印出其命令行参数的值。

 (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.command行已被replace为tools.cli。

https://github.com/clojure/tools.cli

tools.cli曾经被称为clargon。 下面是两个博客文章,给出了使用tools.cli的示例(简单地用tool.clireplace对clargon的引用。post已过期)。

这显示了一些方法,包括老clojure.contrib.command行

原作者重点关注Clargon

我想补充一点,你可以做

 (apply -main *command-line-args*) 

(defn -main ...)之下,使其在解释模式下工作。

在提出问题后很长一段时间,我可以build议在构buildCLI接口时使用docopt库。 有一个用于Clojure – docopt.clj

docopt基于几十年来在帮助消息和手册页中用于程序接口描述的约定。 docopt中的接口描述是这样一个帮助信息,但forms化

所以你可以声明你的界面,并在同一时间logging它 – 这是惊人的,容易做到。

有关更多详情,我build议查看http://docopt.org/

还有一个在线应用程序来检查你的界面http://try.docopt.org/

最后这里是我的例子,如何使用Clojure库。

也许试试jark。 Jark是在持久JVM上运行clojure程序的工具。 它有一些有用的命令行工具。

https://clojars.org/jark

 jark ns load file.clj jark <namespace>.<function> <args> jark if cli-json <namespace><function> args