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

时间:2009-08-27 13:37:49

标签: clojure clojure-contrib

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

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

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

5 个答案:

答案 0 :(得分:119)

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

答案 1 :(得分:32)

旧的clojure.contrib.command-line已替换为tools.cli。

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

tools.cli过去被称为clargon。下面是两个博客文章,提供了使用tools.cli的示例(使用tools.cli简单替换对clargon的任何引用。帖子已过期)。

This shows a few methods ways, including old clojure.contrib.command-line

Post focusing on Clargon by original author

答案 2 :(得分:12)

我想补充一点,你可以做到

(apply -main *command-line-args*)
(defn -main ...)下方

使其在解释模式下工作。

答案 3 :(得分:7)

问题提出很久之后,我建议在构建CLI界面时使用docopt库。有is one for Clojure - docopt.clj

  

docopt基于几十年来在帮助消息和手册页中用于程序界面描述的约定。 docopt中的接口描述是一个帮助消息,但是已经形式化

所以你可以声明你的界面并在同一时间记录它 - 这太棒了,很容易做到。

有关详细信息,建议您查看http://docopt.org/

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

最后here is my example如何使用Clojure lib。

答案 4 :(得分:1)

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

https://clojars.org/jark

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