使用命令行界面构建Clojure应用程序?


79

我刚开始使用Clojure(来自Ruby),我想用命令行界面构建一个小型应用程序。如何处理CL的输入/输出?

我注意到有一个clojure.contrib.command-line,但是文档很薄。

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


9
请注意,如果您的应用程序频繁运行,则每次都将支付JVM启动成本。
斯图尔特·塞拉

1
@StuartSierra不与滴灌

Answers:


120

这是使用其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]

太棒了,这正是我想要的。很彻底 我希望它在Google上排名不错:)
dMix

1
这确实是存在的最棒的例子。
Alex Miller 2010年

9
对于Clojure 1.3,人们可能应该开始使用tools.cli(新贡献者)。参见dev.clojure.org/display/design/Where+Did+Clojure.Contrib+Gogithub.com/clojure/tools.cli
semperos 2011年


12

我想补充一点,你可以做

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

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


7

提出问题很长时间后,我可以建议使用docopt库来构建CLI界面。Clojure一个-docopt.clj

docopt基于数十年来在帮助消息和手册页中用于程序界面描述的约定。docopt中的接口描述就是这样的帮助消息,但是形式化了

因此,您可以同时声明您的接口并对其进行文档化-这非常了不起且容易实现。

有关更多详细信息,我建议检查http://docopt.org/

另外,还有一个在线应用程序可以检查您的界面http://try.docopt.org/

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


1

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

https://clojars.org/jark

jark ns load file.clj
jark <namespace>.<function> <args>
jark if cli-json <namespace><function> args 
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.