返回clojure中的串联参数
需要函数或宏,它接受常量参数(route)和动态参数(args),并返回连接的参数字符串:返回clojure中的串联参数,clojure,Clojure,需要函数或宏,它接受常量参数(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 "/
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"
有什么想法吗?首先,一个宏来做你想做的事情:
(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#)))
现在,我想补充一点,我认为这不是最好的方法,因为它将变量的名称与参数名称联系起来。在我看来,更好的方法是使用一个常规函数,该函数将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"})
但是,任何一种方法都应该有效。首先,一个宏可以执行您想要的操作:
(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#)))
现在,我想补充一点,我认为这不是最好的方法,因为它将变量的名称与参数名称联系起来。在我看来,更好的方法是使用一个常规函数,该函数将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"})
但是,任何一种方法都应该有效。到目前为止,您尝试了什么?此外,如果这是用于真正的web应用程序,则需要注意URL编码:。@PiotrekBzdyl使用参数记录restful服务您没有回答第一个问题:)我也不会这样做。改为使用映射。@m0skit0我已经尝试过定义宏,类似于Josh,到目前为止您尝试过什么?此外,如果这是用于真正的web应用程序,则需要注意URL编码:。@PiotrekBzdyl使用参数记录restful服务您没有回答第一个问题:)我也不会这样做。改为使用映射。@m0skit0我已经尝试过定义宏,类似于Josh的东西。这确实是一个非常糟糕的主意。@m0skit0为什么?有参数吗?@Josh macro对我来说不是个坏主意,因为变量名和查询参数是相同的。我有rest服务器,在一开始我想记录每个参数。(DeFrutsMyRead……(get /Cub)[ID](日志/调试(完整URL)/卡“ID”)(获取卡ID)……@ YkEnBayEV,而不是显式地获得<代码> ID 参数,您应该考虑在处理程序的开始处执行日志记录,其中已经在地图中有完整的查询参数,这将与上面的函数(而不是宏)完美配合。这确实是一个非常糟糕的主意。@m0skit0为什么?有参数吗?@Josh macro对我来说不是个坏主意,因为变量名和查询参数是相同的。我有rest服务器,在一开始我想记录每个参数。(DeFrutsMyRead……(get /Cub)[ID](日志/调试(完整URL)/卡“ID”)(获取卡ID)……@ YkEnBayEV,而不是显式地获得<代码> ID 参数,您应该考虑在处理程序的开始处执行日志记录,其中已经在地图中有完整的查询参数,这将与上面的函数(而不是宏)完美配合。