2017-07-31 213 views
2

我有一个主函数声明它接受命令行参数传递命令行参数

(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 。

我曾尝试多种方法来在REPL通过ARGS包括

我试过多次失败的尝试,以及试图通过列表

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

(-main ("key-val" "user-val"))(打印nil nil)或抛出转换错误的向量。

+1

是否(或可能)铸造错误指向您应该传入的类型?你也可以尝试打印'args',而不需要解析它们的中间步骤。也许“key-val”“user-val”正在通过。 –

+0

@ChrisMurphy这是问题。我应该打印参数并检查。根据已被接受的答案,参数得到通过很好,但没有被解析。 – gargsms

回答

3

你已经用键“-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"] 
+0

完美的作品。监督现在看起来太明显了。 – gargsms

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))) 

解析-OPTS调用指定您希望命名参数,即选项解析。呼叫像REPL了以下工作:

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

请注意,如果您指定的位置参数,他们是在关键:arguments。改变打印势必选项((println options))的值的例子之后,你的榜样通话将工作就像这样:

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

于是有人呼吁不选项,即没有指定命名参数