学习 Clojure/解构
外观
特殊形式 let、loop 和 fn 实际上是宏:真正的特殊形式分别命名为 let*、loop* 和 fn*。宏最常用于代替实际的特殊形式,因为宏添加了一个名为 解构 的便利功能。
通常,函数期望接收一个集合参数,它打算使用该集合中的特定项目
; return the sum of the 1st and 2nd items of the sequence argument (defn foo [s] (+ (first s) (frest s))) ; sum the first item and the "frest" (first of the rest) item
提取我们想要的值可能变得非常冗长,但在许多情况下,使用解构可以提供帮助
; return the sum of the 1st and 2nd items of the sequence argument (defn foo [s] (let [[a b] s] (+ a b)))
在上面,通常在参数列表中指定参数名称的地方,我们放置一个向量,后跟参数名称:传递给参数 s 的集合中的项目根据位置绑定到向量中的 a 和 b 名称。类似地,我们可以使用映射进行解构
(def m {:apple 3 :banana 5}) (let [{x :apple} m] ; assign the value of :apple in m to x x) ; return x
[我必须说这对我来说感觉很奇怪:难道不应该是 (let [{:apple x} m] x) 吗?我喜欢将解构表达式看作是镜像被解构的集合。]
解构还可以用于提取集合内集合的值。Hickey 在 这里 给出了更完整的介绍。