在clojure中返回连接的params

时间:2017-01-05 10:20:25

标签: clojure

需要函数或宏,它接受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"

有什么想法吗?

1 个答案:

答案 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"})

但是,无论哪种方式都应该有效。