我有一个接受命令行参数的主函数声明
(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
)
我尝试了多次失败的尝试,并试图传递一个抛出投射错误的列表或向量。
答案 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)
首先,请注意user
和key
未绑定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 {} ...}
所以调用是在没有选项的情况下进行的,也就是说,没有指定命名参数。