2017-01-05 4 views
0
функции

Необходимости или макросъемки, который принимает сопзИте параметры (маршрута) и динамические параметры (ARGS) и вернуть сцепленную строку параметров:Возвращение сцепленного Params в Clojure

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

Что вы пробовали? Кроме того, если это предназначено для использования в реальном веб-приложении, вам необходимо позаботиться о кодировке URL: https://en.wikipedia.org/wiki/Query_string#URL_encoding. –

+0

@PiotrekBzdyl для регистрации обслуживаемых служб с параметрами – ykembayev

+0

Вы не ответили на первый вопрос :) Также я бы этого не сделал. Вместо этого используйте карту. – m0skit0

ответ

1

Во-первых, макрос, чтобы сделать то, что вы хотите:

(defmacro full-url 
    [route & args] 
    `(let [var-names# (map #(str %1 "=") '~args) 
     var-vals# (list [email protected]) 
     joined# (clojure.string/join "&" (map str var-names# var-vals#))] 
    (str ~route "?" joined#))) 

Теперь я хотел бы добавить, что я не думаю, что это лучший подход, поскольку он связывает имена ваших Варс именам Param. IMO лучше использовать регулярную функцию, которая берет карту как второй аргумент, который имеет ключевые слова и значения. Такие как:

(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"}) 

Но в любом случае это должно сработать.

+0

Это действительно ** очень плохая ** идея. – m0skit0

+0

@ m0skit0 почему? любые аргументы? – ykembayev

+0

@Josh макрос неплохая идея в моем случае, потому что имена переменных и параметры запроса одинаковы. У меня есть сервер отдыха, и в начальной точке я хочу регистрировать каждый параметр. (defroutes MyRoutes ... (GET "/ карты" [ID] (журнал/отладки (полный URL-адрес "/ карта" идентификатор)) (получить открытку ID)) ... ) – ykembayev