Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
返回clojure中的串联参数_Clojure - Fatal编程技术网

返回clojure中的串联参数

返回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 "/

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

有什么想法吗?

首先,一个宏来做你想做的事情:

(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 参数,您应该考虑在处理程序的开始处执行日志记录,其中已经在地图中有完整的查询参数,这将与上面的函数(而不是宏)完美配合。