这个 core.match 绑定示例如何工作?

How does this core.match binding example work?

看到这个example:

(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. 假设我得到了上面的两点,为什么 return a 而不是 b 考虑到它们都匹配 [x y] 的一部分。是不是因为是最后一个子句?

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

匹配的模板

第一个模式是 [1 b],它与输入匹配,因为第一个模板项是一个匹配的文字值 1,第二个模板项是一个 binding 将在输入的那个位置保存 any 值,在这种情况下恰好是 2b 绑定可以从匹配子句的右侧访问,就好像它是 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]

Does 2 match y and gets bound to a?

模式匹配,但这无关紧要,因为前面的模式已经匹配。如果匹配成功,a 将绑定到 1.