看这个例子:
(let [x 1 y 2]
(match [x y]
[1 b] b
[a 2] a
:else nil))
;=> 2
我无法理解一些事情:
- 是否
1
匹配x
并绑定到b
? - 是否
2
匹配y
并绑定到a
? - 假设我得到了正确的以上两点,为什么要返回
a
而不是b
考虑它们都匹配[x y]
. 是因为它是最后一个子句吗?
看这个例子:
(let [x 1 y 2]
(match [x y]
[1 b] b
[a 2] a
:else nil))
;=> 2
我无法理解一些事情:
1
匹配x
并绑定到b
?2
匹配y
并绑定到a
?a
而不是b
考虑它们都匹配[x y]
. 是因为它是最后一个子句吗?将每个模式视为要与输入匹配的模板[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
。