用未知的钥匙解构地图的地图

时间:2014-02-09 23:36:00

标签: clojure

我有以下作为例子:

(def _t2 {:oxnard {:value-type "string" :rec-name "foo"}})

其中:oxnard 动态且未知的功能 ,并且包含的​​地图由众所周知的密钥名称组成(例如{{1 }和:value-type)。

我正在尝试在不知道外部map关键字的情况下编写具有解构的函数,例如:

:rec-name

或类似;但是,我似乎无法绕过外部密钥名称而不知道。

2 个答案:

答案 0 :(得分:5)

假设您的函数作为参数传递了动态键,您可以使用它来提取内部地图,然后可以使用它来提取内部地图并解构:

(let [{:keys [foo bar]} (get outer-map :inner-key)]
  ...)

;; k could be a function argument or Var rather than a let local
(let [k :inner-key
      {k {:keys [foo bar]}} outer-map]
  ...)

如果重点是外部地图中只有一个条目,您可以使用firstval提取内部地图或在地图上调用seq并解构:

(let [{:keys [foo bar]} (val (first outer-map))]
  ...)

(let [[[_ {:keys [foo bar]}]] (seq outer-map)]
  ...)

在后一种情况下,(seq outer-map)将具有([k v])形式(包含一个地图条目的seq);解构形式中的外部向量解构seq,内部向量解构地图条目,_是您不关心的关键字的占位符,{:keys [foo bar]}解构内部地图。你必须自己在地图上调用seq,解构机制不会为你做。

答案 1 :(得分:0)

这个怎么样?

(defmacro somekey
  [complex-map]
  (let [k (first (keys complex-map))]    ; get key from the outer map
    `(let [{inner-map# ~k} ~complex-map] ; use it for destructuring
        inner-map#)))                    ; make this as complex as you want

也许这里有一个缺陷,我冒着失败的风险,但它似乎有效。可能不会比Michal的实际应用更好,即使如此。 (当然,在其他条件相同的情况下,最好避免宏,除非它们确实是必要的。)