3

看这个例子

(let [x 1 y 2]
  (match [x y]
    [1 b] b
    [a 2] a
   :else nil))
;=> 2

我无法理解一些事情:

  1. 是否1匹配x并绑定到b
  2. 是否2匹配y并绑定到a
  3. 假设我得到了正确的以上两点,为什么要返回a而不是b考虑它们都匹配[x y]. 是因为它是最后一个子句吗?
4

1 回答 1

4

将每个模式视为要与输入匹配的模板[x y][1 2].

第一个模式[1 b]与输入匹配,因为第一个模板项是一个匹配的文字值1,第二个模板项是一个绑定,它将在输入的那个位置保存任何值,在这种情况下恰好是2这种情况。b可以从 match 子句的右侧访问该绑定,就好像它是一个let绑定一样。

这个例子可能会更清楚地展示它:

(let [x 1 y 2]
  (match [x y]
    [1 b] [1 (inc b)] ;; recreate the input with (inc b)
    [a 2] a           ;; this never matches because prior match works
    :else nil))
=> [1 3]

是否2匹配y并绑定到a

该模式是匹配的,但这并不重要,因为前面的模式已经是匹配的。如果是成功的匹配,a将被绑定到1

于 2020-05-09T10:49:26.600 回答