解构是一种方便的功能,它允许通过分解复杂的数据结构(seq-ables 像向量或 associatives 来轻松创建本地绑定(不是变量!)像哈希映射),正如它所描述的here。
举个例子:
(let [v [1 2 3 4 5 6]
v_0 (first v)
v_1 (nth v 1)
v_rest (drop 2 v)
m {:a 1 :b 2}
m_a (get m :a)
m_b (get m :b)
m_default (get m :c "DEFAULT")]
(println v, v_0, v_1, v_rest, m, m_a, m_b, m_default))
然后可以使用解构绑定来简化上面的代码,如下所示:
(let [[v_0 v_1 & v_rest :as v]
[1 2 3 4 5 6]
{m_a :a m_b :b m_default :c :or {m_default "DEFAULT"} :as m}
{:a 1 :b 2}]
(println v, v_0, v_1, v_rest, m, m_a, m_b, m_default))
解构模式可用于let 绑定和函数参数(fn、defn、letfn 等),也可用于返回包含此类解构模式的let 绑定的宏。
需要注意的一个重要用法是使用 if-let 和 when-let 宏。 if 语句始终在整个表单上进行评估,即使解构绑定本身评估为 nil:
(if-let [{:keys [a b]}
{:c 1 :d 2}]
(println a b)
(println "Not this one"))