跳转至内容

学习 Clojure/解构

来自维基教科书,开放的书籍,开放的世界

特殊形式 letloopfn 实际上是宏:真正的特殊形式分别命名为 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 的集合中的项目根据位置绑定到向量中的 ab 名称。类似地,我们可以使用映射进行解构

(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 在 这里 给出了更完整的介绍。

华夏公益教科书