Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用命令行界面构建Clojure应用程序?_Clojure_Clojure Contrib - Fatal编程技术网

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

使用命令行界面构建Clojure应用程序?,clojure,clojure-contrib,Clojure,Clojure Contrib,我刚刚启动了w/Clojure(来自Ruby),我想构建一个带有命令行界面的小应用程序。如何处理CL的输入/输出 我注意到有一个clojure.contrib.command行,但是文档很薄 下面是一个将其与命令行宏一起使用的示例。下面的代码指定了一个普通类,该类具有一个main方法,该方法只打印其命令行参数的值 (ns cmd-line-demo (:gen-class) (:use clojure.contrib.command-line)) (defn -main [&

我刚刚启动了w/Clojure(来自Ruby),我想构建一个带有命令行界面的小应用程序。如何处理CL的输入/输出

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


下面是一个将其
与命令行
宏一起使用的示例。下面的代码指定了一个普通类,该类具有一个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.  
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]

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

(apply -main *command-line-args*)
下面的
(defn-main…
,以使其在解释模式下工作。

可以尝试jark。 Jark是一种在持久JVM上运行clojure程序的工具。它有一些有用的命令行实用程序

jark ns load file.clj
罐子。
如果cli json参数为jark

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

tools.cli以前被称为clargon。下面是两篇博客文章,给出了使用tools.cli的示例(简单地用tools.cli替换对clargon的任何引用。文章已过时)


问题提出很久之后,我可以建议在构建CLI界面时使用
docopt
库。那里

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

因此,您可以声明您的界面,并同时对其进行文档记录,这是一件令人惊奇且容易做到的事情

有关更多详细信息,我建议查看

还有一个在线应用程序可以检查你的界面


最后是如何使用Clojure库。

太棒了,这正是我想要的。非常彻底。我希望这在Google上排名很好:)这确实是现有最棒的例子。对于Clojure 1.3,人们应该开始使用tools.cli(新contrib)。请参阅并注意,如果您的应用程序经常运行,您每次都将支付JVM启动费用。@StuartSierra不需要
(apply -main *command-line-args*)
jark ns load file.clj
jark <namespace>.<function> <args>
jark if cli-json <namespace><function> args