在lein repl中传递命令行参数

时间:2017-07-31 12:47:20

标签: clojure leiningen

我有一个接受命令行参数的主函数声明

(defn -main [& args]
    (let [options (cli/parse-opts args [["-k", "--key KEY","Secret key"]
                                        ["-u", "--user USER", "User name"]])]
        (println user key)))

我正在尝试在lein repl中加载它以进行调试,但无法弄清楚如何通过REPL传递参数。

我尝试过多种方法将args传递给repl,包括

(-main "key-val" "user-val")(打印nil nil

(-main ("key-val" "user-val"))(打印nil nil

我尝试了多次失败的尝试,并试图传递一个抛出投射错误的列表或向量。

2 个答案:

答案 0 :(得分:4)

你已经用键定义了params" -k"并且" -u",但是没有将密钥传递给函数,因此解析器无法猜出你期望它得到什么。工作版本是这样的:

user> (defn -main [& args]
        (let [options (cli/parse-opts args [["-k", "--key KEY","Secret key"]
                                            ["-u", "--user USER", "User name"]])
              {:keys [key user]} (:options options)]
          [key user]))
#'user/-main

user> (-main "-k" "key-val" "-u" "user-val")
;;=> ["key-val" "user-val"]

user> (-main "--key" "key-val" "--user" "user-val")
;;=> ["key-val" "user-val"]

答案 1 :(得分:2)

首先,请注意userkey未绑定parse-opts的结果。 parse-opts returns a map这些选项位于密钥:options下。 让我们按如下方式绑定结果:

(defn -main [& args]
  (let [options (parse-opts args [["-k", "--key KEY","Secret key"]
                                  ["-u", "--user USER", "User name"]])
        user (get-in options [:options :user])
        key  (get-in options [:options :key])]
    (println user key)))

您的 parse-opts 调用指定您希望命名参数,即选项进行解析。以下调用来自REPL:

(-main "-k a" "-u b") ; prints "b a"

请注意,如果指定位置参数,则它们位于键:arguments下。更改示例以打印绑定到选项((println options))的值后,您的示例调用将如下工作:

(-main "key-val" "user-val") ; {:arguments [key-val user-val] :options {} ...}

所以调用是在没有选项的情况下进行的,也就是说,没有指定命名参数