Clojure匿名函数是否支持命名参数?附闭包代码示例疑问
理解Clojure闭包中的匿名函数参数与命名支持
嘿,我完全懂你的困惑——从JavaScript的箭头函数切换到Clojure的语法,确实会有这种“参数去哪了”的懵圈时刻!咱们一步步拆解你的例子,再解答你关于命名参数的问题。
先搞懂你的inc-maker例子
先看你给出的Clojure代码:
(defn inc-maker "Create a custom incrementor" [inc-by] #(+ % inc-by)) (def inc3 (inc-maker 3)) (inc3 7) ; => 10
这里的#(+ % inc-by)是Clojure匿名函数的简写语法:
%是这个匿名函数的第一个参数的占位符,就对应你JS代码里第二个箭头函数的incByY。- 当你调用
(inc3 7)时,7被传递给这个匿名函数,绑定到%上,然后和之前inc-maker传入的inc-by(也就是3)相加,结果自然是10。
对比你的JS代码:
const incMaker = incByX => incByY => incByX + incByY; const incThree = incMaker(3); incThree(7);
Clojure的简写匿名函数#(+ % inc-by)完全等价于JS里的incByY => incByX + incByY,只是语法上用占位符代替了命名参数而已。
Clojure匿名函数支持命名参数吗?
当然支持!只是不能用简写的#(...)语法,得用完整的匿名函数定义语法(fn [param-name] ...)。
比如把你的inc-maker改成带命名参数的版本:
(defn inc-maker "Create a custom incrementor" [inc-by] (fn [num] (+ num inc-by))) ; 这里的num就是命名参数
现在调用(inc3 7)时,7会被绑定到num这个命名参数上,逻辑和你写的JS代码几乎完全对应,是不是一下子就清晰了?
另外补充一下:如果你的匿名函数需要多个参数,简写语法里可以用%1、%2、%3来分别代表第1、2、3个参数,比如#(+ %1 %2)就是接受两个参数相加的匿名函数,但这种写法还是不如命名参数直观,尤其是参数多的时候,用(fn [a b] (+ a b))可读性会好很多。
内容的提问来源于stack exchange,提问作者Mr. Robot
相关产品推荐
相关产品推荐

