0

我是clojure的新手,所以请多多包涵。

像这样写一个宏:

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

该块的第一行let解构了一个query-paramsfrom 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]

谁能解释为什么select-keys不起作用?

PS尝试过(get query# :from) & (:from query#)-那里也没有运气。

UPD

键是字符串,而不是关键字 - 因此使用字符串作为键就可以了。

4

2 回答 2

1

By the way, you can also destructure string keys with :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     

See https://clojure.org/guides/destructuring for a full description of the destructuring syntax.

于 2017-02-01T15:29:33.873 回答
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}

另外我质疑这是否需要成为一个宏,是否有一个普通函数不起作用的原因?

于 2017-02-01T15:35:25.967 回答