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

时间:2020-05-09 10:09:56

标签: clojure clojure-core.match

查看此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. 假设我正确理解了上述两点,考虑到它们都与a的一部分匹配,为什么返回b而不是[x y]。是因为这是最后一个子句吗?

1 个答案:

答案 0 :(得分:4)

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

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

相关问题