我想使用另一个匿名函数的简写符号来调用 not 的匿名函数。
执行以下操作无效,因为返回了上一次评估:
user> ((fn [x] (fn [y] (inc y)) x) 3)
3
现在我想有办法从外部调用内部匿名函数。
我设法通过这样做使它工作但看起来很复杂:
user> ((fn [x] (let [f (fn [y] (inc y))] (f x))) 3)
4 ;; good, 4 is the result I want here
是否有更简单的方法来嵌套匿名函数?
答案 0 :(得分:8)
让我们打破第一线:
((fn [x]
(fn [y] (inc y)) ; construct an anonymous function
x) ; return the outer parameter
3)
请注意,永远不会使用内部函数。
您似乎想要做的事情:
((fn [x]
((fn [y] (inc y)) x))
3)
答案 1 :(得分:5)
我强烈建议您使用let
表单来提高代码的清晰度,例如
(let [f (fn [y] (inc y))
g (fn [x] (f x))]
(g 3))
我甚至可以接受前者的其他功能。
(let [f (fn [y] (inc y))
g (fn [h x] (h x))]
(g f 3))
或甚至如下:
(let [f (fn [y] (inc y))
g (fn [h x] (h x))
gf (partial g f)]
(gf 3))
它使阅读和理解功能变得更加容易。即使使用let
,我也不会停留在这里并继续开展其他更好的功能。
经过一番思考后,我认为当f
这样做时,不需要定义一个arg函数inc
。另外一个人可能会被the reader's anonymous function literal带走,let
形式变为:
(let [f inc
g #(% %2)
gf (partial g f)]
(gf 3))
但是我想的越多,我对问题的理解就越少。
你能描述一下你真正想要达到的目标吗?