这个 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
是否匹配 x
并绑定到 b
?
2
是否匹配 y
并绑定到 a
?
- 假设我得到了上面的两点,为什么 return
a
而不是 b
考虑到它们都匹配 [x y]
的一部分。是不是因为是最后一个子句?
将每个模式视为要与输入 [x y]
或 [1 2]
.
匹配的模板
第一个模式是 [1 b]
,它与输入匹配,因为第一个模板项是一个匹配的文字值 1
,第二个模板项是一个 binding 将在输入的那个位置保存 any 值,在这种情况下恰好是 2
。 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]
Does 2
match y
and gets bound to a
?
模式匹配,但这无关紧要,因为前面的模式已经匹配。如果匹配成功,a
将绑定到 1
.
看到这个example:
(let [x 1 y 2]
(match [x y]
[1 b] b
[a 2] a
:else nil))
;=> 2
我无法理解一些事情:
1
是否匹配x
并绑定到b
?2
是否匹配y
并绑定到a
?- 假设我得到了上面的两点,为什么 return
a
而不是b
考虑到它们都匹配[x y]
的一部分。是不是因为是最后一个子句?
将每个模式视为要与输入 [x y]
或 [1 2]
.
第一个模式是 [1 b]
,它与输入匹配,因为第一个模板项是一个匹配的文字值 1
,第二个模板项是一个 binding 将在输入的那个位置保存 any 值,在这种情况下恰好是 2
。 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]
Does
2
matchy
and gets bound toa
?
模式匹配,但这无关紧要,因为前面的模式已经匹配。如果匹配成功,a
将绑定到 1
.