2017-01-05 81 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

你到目前爲止嘗試過什麼?此外,如果這意味着要在真實的Web應用程序中使用,則需要注意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#))) 

,我想補充一點,我不認爲這是最好的方法,因爲這樣會使得你瓦爾的名稱帕拉姆名稱。國際海事組織一個更好的方法是使用一個常規函數,它將地圖作爲第二個參數,它具有關鍵字和值。如:

(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)) (獲得卡ID)) ... ) – ykembayev