首页 > 解决方案 > 如何在 Clojure 中使用命令行参数?

问题描述

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

我遇到的所有例子看起来都非常复杂,很容易让我头疼。

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

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

标签: clojureleiningen

解决方案


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

我正在尝试做的一个简单示例是在用户提供任意数量的命令行参数之后,然后让 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!"))))

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

您还可以将整个替换为doseq

(mapv println args)

但这可以说是对mapv.


推荐阅读