【问题标题】:clojure - trouble destructing map inside macroclojure - 在宏内破坏地图的麻烦
【发布时间】:2017-06-18 05:59:35
【问题描述】:

我是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 不起作用?

附:试过(get query# :from) & (:from query#) - 也没有运气。

UPD

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

【问题讨论】:

  • 您确定地图中的键是关键字而不是符号或字符串吗?
  • @Lee 刚刚编辑了我的问题,是的,它们是符号。

标签: clojure macros destruction


【解决方案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

【讨论】:

    【解决方案2】:

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

    您应该阅读其中的区别:

    惯用的做法是通常更喜欢使用关键字作为映射键,尽管来自互联网的东西(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}
    

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

    【讨论】:

    • 您好,谢谢您的回答,没有混淆,输入错误,我尝试编辑评论,但它没有让我:-(
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-05
    • 1970-01-01
    • 2014-09-11
    相关资源
    最近更新 更多