我有以下例子:
(def _t2 {:oxnard {:value-type "string" :rec-name "foo"}})其中,:oxnard是,动态的,未知的函数,包含的映射由著名的密钥名(例如:value-type和:rec-name)组成。
我试图在不知道外部map关键字的情况下编写一个具有析构的函数,例如:
(defn if-foo? [ignoremapfirstkey &
{:keys [value-type rec-name]}]
(= rec-name "foo"))或者类似的;然而,我似乎无法绕开外键名--不为人所知。
发布于 2014-02-10 00:09:45
假设将动态键作为参数传递给您的函数,您可以使用它提取内部映射,然后使用它提取内部映射并构造如下:
(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打电话,破坏机器不会为你这么做的。
发布于 2014-02-10 02:07:39
那这个呢?
(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也许这里有个缺陷,我冒着被否决的危险,但这似乎奏效了。也许比米哈尔的答案更实用,即便如此。(当然,在其他条件相同的情况下,最好避免宏,除非它们是真正必要的。)
https://stackoverflow.com/questions/21666636
复制相似问题