clojure - 在宏内部破坏地图的麻烦

时间:2017-02-01 13:08:22

标签: clojure macros destruction

我是clojure的新手,所以请耐心等待。

编写宏如下:

 `(let [query#   (:query-params ~'+compojure-api-request+)
        options# (select-keys query# [:sort-by :from :to])])

let块的第一行从query-params解构http request - 产生这种结构:

{sort-by billing-account/name, from 0, to 10, payment-due , payment-method , search }

麻烦在于第二行 - 当我使用select-keys时它返回一张空地图,但是当我说例如(first query#)时 - 输出如下所示:[sort-by billing-account/name] < / p>

有人可以解释为什么select-keys不起作用吗?

P.S。试过(get query# :from) & (:from query#) - 那里也没有运气。

UPD

键是字符串,而不是关键字 - 因此使用字符串作为键可以正常工作。

2 个答案:

答案 0 :(得分:1)

顺便说一下,您还可以使用: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

答案 1 :(得分:0)

我认为您对关键字,符号和字符串之间的差异感到困惑。在您的评论中,您说他们是符号,但在您的编辑中,您说他们是字符串。

你应该读一下差异:

惯用的事情通常是喜欢使用关键字作为地图键,尽管来自互联网(json,http标题等)的东西有时都是字符串。

要直接回答您的问题,传递给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}

我还质疑这是一个宏的必要性,是否有一个原因是一个普通的功能不起作用?