You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多
文档控制台
免费开始使用

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

火山引擎 最新活动