需要函数或宏,它接受const参数( route )和动态参数( args )并返回连接的参数字符串:
user>(defn full-url [route & args] *need code* )
#'user/full-url
user> (def p1 "value1")
#'user/p1
user> (def p2 "value2")
#'user/p2
user> (def p3 "value3")
#'user/p3
user> (full-url "/init" p1 p2 p3)
"/init?p1=value1&p2=value2&p3value4"
有什么想法吗?
答案 0 :(得分:2)
首先,一个宏来做你想做的事:
(defmacro full-url
[route & args]
`(let [var-names# (map #(str %1 "=") '~args)
var-vals# (list ~@args)
joined# (clojure.string/join "&" (map str var-names# var-vals#))]
(str ~route "?" joined#)))
现在,我想补充一点,我不认为这是最好的方法,因为它将你的变量名称与param名称联系起来。 IMO更好的方法是使用一个常规函数,它将map作为第二个参数,具有关键字和值。如:
(defn full-url-fn
[route params]
(->> params
(map #(str (name (first %)) "=" (second %)))
(clojure.string/join "&")
(str route "?")))
(full-url-fn "/init" {:p1 "value1" :p2 "value2"})
但是,无论哪种方式都应该有效。