Ced*_*tin 3 function clojure anonymous-function
我想调用一个匿名函数,它不使用另一个匿名函数的简写符号.
执行以下操作无效,因为返回了上次评估:
user> ((fn [x] (fn [y] (inc y)) x) 3)
3
Run Code Online (Sandbox Code Playgroud)
现在我想有办法从外部调用内部匿名函数.
我设法通过这样做使它工作,但它看起来很复杂:
user> ((fn [x] (let [f (fn [y] (inc y))] (f x))) 3)
4 ;; good, 4 is the result I want here
Run Code Online (Sandbox Code Playgroud)
是否有更简单的方法来嵌套匿名函数?
让我们打破第一线:
((fn [x]
(fn [y] (inc y)) ; construct an anonymous function
x) ; return the outer parameter
3)
Run Code Online (Sandbox Code Playgroud)
请注意,从不使用内部函数.
你似乎想做什么:
((fn [x]
((fn [y] (inc y)) x))
3)
Run Code Online (Sandbox Code Playgroud)
我强烈建议使用该let
表单来提高代码的清晰度,例如
(let [f (fn [y] (inc y))
g (fn [x] (f x))]
(g 3))
Run Code Online (Sandbox Code Playgroud)
我甚至可以接受前者的其他功能.
(let [f (fn [y] (inc y))
g (fn [h x] (h x))]
(g f 3))
Run Code Online (Sandbox Code Playgroud)
甚至如下:
(let [f (fn [y] (inc y))
g (fn [h x] (h x))
gf (partial g f)]
(gf 3))
Run Code Online (Sandbox Code Playgroud)
它使阅读和因此理解功能更容易.即使let
我不会停留在这里,并继续努力另一个更好的功能.
有点想法后,我觉得没有必要定义一个带参数的函数f
时inc
做到这一点.还有一个人可能会使用读者的匿名函数文字被带走,并且let
表单变为:
(let [f inc
g #(% %2)
gf (partial g f)]
(gf 3))
Run Code Online (Sandbox Code Playgroud)
但我想的越多,我对问题的理解就越少.
你能描述一下你真正想要达到的目标吗?