Clojure中('+ 1 2)返回2、传3参报错的原因及运行机制?
Clojure中
('+ 1 2)与('+ 1 2 3)的行为差异解析 先看REPL中的执行结果:
('+ 1 2) ; 输出 2 ('+ 1 2 3) ; 报错 clojure.lang.ArityException: Wrong number of args (3) passed to: clojure.lang.Symbol
背后的运行机制
'+的本质:'+是一个clojure.lang.Symbol实例,也就是代表+这个名称的符号对象,而非加法函数。Clojure里的单引号是阻止求值的语法,所以这里不会把+解析成加法函数,而是直接返回符号本身。符号作为函数的调用规则:Clojure的符号类实现了
IFn接口,允许被当作函数调用,但它只支持两种参数数量:- 传1个参数时:
(符号 参数)直接返回这个参数 - 传2个参数时:
(符号 参数1 参数2)直接返回第二个参数 - 传超过2个参数时:由于符号类没有实现对应参数数量的调用方法,就会抛出参数不匹配的
ArityException
- 传1个参数时:
对应示例的解释:
('+ 1 2)是2个参数的调用,所以直接返回第二个参数2('+ 1 2 3)传了3个参数,超出符号支持的参数数量范围,因此触发报错
内容的提问来源于stack exchange,提问作者rusfrompiter
相关产品推荐
相关产品推荐

