core.match绑定示例运行原理及匹配逻辑疑问解析
解答你的Clojure
match匹配疑问 嘿,我们一步步拆解这段代码,把你的疑问逐个弄明白:
先看这段核心代码:
(let [x 1 y 2] (match [x y] [1 b] b [a 2] a :else nil)) ;=> 2
疑问1:是否是1匹配x并绑定到b?
不对哦,这里的逻辑是:
1是字面量匹配,用来精准匹配x的实际值(也就是1);b是一个绑定变量,会把当前匹配位置的y的值(也就是2)绑定到b上。
简单说:是x匹配了1,同时y的值被绑定给b,不是把x绑定到b。
疑问2:是否是2匹配y并绑定到a?
同样理解偏差啦:
2是字面量匹配,用来精准匹配y的实际值(也就是2);a是绑定变量,会把当前匹配位置的x的值(也就是1)绑定到a上。
也就是y匹配了2,x的值被绑定给a,不是2匹配y并绑定到a。
疑问3:若上述两点理解正确,为何返回a而非b?是否因为该匹配子句是最后匹配项?
首先你的前两点理解是错误的,这个问题的前提就不成立啦~ 实际执行逻辑是:
Clojure的match是按从上到下的顺序匹配分支,只要找到第一个完全匹配的分支,就会执行该分支的表达式并返回结果,后续分支不会再触发。
这段代码里,[x y]实际是[1 2],第一个分支[1 b]完全匹配:第一个元素是1(匹配x的值),第二个元素是2(被绑定到b)。所以这个分支会直接执行,返回b的值也就是2,第二个分支[a 2]根本不会被运行。
所以代码最终返回的是b的值2,而不是a的值哦~
内容的提问来源于stack exchange,提问作者customcommander




