[英]clojure - trouble destructing map inside macro
我是Clojure的新手,所以請多多包涵。
這樣編寫宏:
`(let [query# (:query-params ~'+compojure-api-request+)
options# (select-keys query# [:sort-by :from :to])])
let
塊的第一行從http request
解構了一個query-params
-產生了以下結構:
{sort-by billing-account/name, from 0, to 10, payment-due , payment-method , search }
問題出在第二行–當我使用select-keys
,它返回一個空的映射,但是當我說(first query#)
,輸出看起來像這樣: [sort-by billing-account/name]
誰能解釋一下為什么select-keys
不起作用?
PS嘗試過(get query# :from) & (:from query#)
-那里也沒有運氣。
UPD
鍵是字符串,而不是關鍵字-因此,將字符串用作鍵就可以了。
順便說一句,您也可以使用:strs
來解構字符串鍵:
(let [m {"sort-by" "billing-account/name",
"from" "0",
"to" "10",
"payment-due" nil,
"payment-method", "search"}
{:strs [sort-by from to payment-due payment-method]} m]
(println sort-by from to payment-due payment-method))
;;=> billing-account/name 0 10 nil search
有關解構語法的完整說明,請參見https://clojure.org/guides/destructuring 。
我認為關鍵字,符號和字符串之間的差異會讓您感到困惑。 在您的評論中,您說它們是符號,但在編輯中,您說它們是字符串。
您應該閱讀其中的區別:
習慣用法是通常更喜歡使用關鍵字作為映射鍵,盡管來自互聯網的內容(json,http標頭等)有時全都是字符串。
為了直接回答您的問題,傳遞給select-keys
必須與映射中select-keys
相同(使用=
函數),因此在這種情況下,它們必須為相同類型。
;; For example
(select-keys {'foo 1 'bar 2} ['foo]) ;=> {foo 1}
(select-keys {:foo 1 :bar 2} [:foo]) ;=> {:foo 1}
(select-keys {"foo" 1 "bar" 2} ["foo"]) ;=> {"foo" 1}
我也質疑是否需要將此作為宏,是否有一個普通函數無法正常工作的原因?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.