[英]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.