我有以下作为例子:
(def _t2 {:oxnard {:value-type "string" :rec-name "foo"}})
其中:oxnard
是 动态且未知的功能 ,并且包含的地图由众所周知的密钥名称组成(例如{{1 }和:value-type
)。
我正在尝试在不知道外部map关键字的情况下编写具有解构的函数,例如:
:rec-name
或类似;但是,我似乎无法绕过外部密钥名称而不知道。
答案 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]
...)
如果重点是外部地图中只有一个条目,您可以使用first
和val
提取内部地图或在地图上调用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的实际应用更好,即使如此。 (当然,在其他条件相同的情况下,最好避免宏,除非它们确实是必要的。)