如何在 Clojure 中使用命令行参数?

ora*_*eel 5 clojure leiningen

我正在研究我的第一个 Clojure 程序。我剩下要做的一件事是让我的程序接受命令行参数。args 的数量可以变化(但至少需要一个),然后每个命令行 arg 需要作为参数提供给 my 中的函数main,一次一个。我一直在网上阅读,这似乎clojure/tools.cli是这样做的方法,(parse-opts可能使用?)。但我无法弄清楚我的生活。没有验证,确实需要进行验证——用户提供的任何内容都是有效的。(唯一需要检查的是至少提供了一个参数)。关于如何解决这个问题的任何建议?

我遇到的所有示例看起来都非常复杂,而且很容易让我无法理解。

我正在尝试做的一个简单示例是在用户提供任意数量的命令行参数之后,然后让 clojure 在终端的新行中​​打印每个字符串。

我使用 leiningen 来运行我的程序。

Cha*_*ffy 5

简单的方法是使用clojure.core/*command-line-args*

(doseq [arg *command-line-args*]
  (println (str "Read an argument: " arg)))
Run Code Online (Sandbox Code Playgroud)


Car*_*ate 5

由于您的整个问题似乎归结为:

我正在尝试做的一个简单示例是在用户提供任意数量的命令行参数之后,然后让 clojure 在终端的新行中​​打印每个字符串。

我会回答那个。这可以相当简洁地完成:

(defn -main [& args] ; & creates a list of var-args
  (if (seq args)
    ; Foreach arg, print the arg...
    (doseq [arg args]
      (println arg))

    ; Handle failure however here
    (throw (Exception. "Must have at least one argument!"))))
Run Code Online (Sandbox Code Playgroud)

请注意,除非您绝对想在传递 0 个参数时彻底失败,否则您可以跳过seq检查。doseq如果args为空则不会运行,因为没有任何东西可以迭代。

您还可以将整个替换为doseq

(mapv println args)
Run Code Online (Sandbox Code Playgroud)

但这可以说是滥用mapv.

  • @orangeorangepeel 您可能不想两次调用 `(find-files arg path)`。听起来很贵。您应该调用一次,使用 `let` 绑定保存结果,然后使用它。 (2认同)