从匿名函数调用匿名函数

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)

是否有更简单的方法来嵌套匿名函数?

Sva*_*nte 8

让我们打破第一线:

((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)


Jac*_*ski 5

我强烈建议使用该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我不会停留在这里,并继续努力另一个更好的功能.

有点想法后,我觉得没有必要定义一个带参数的函数finc做到这一点.还有一个人可能会使用读者的匿名函数文字被带走,并且let表单变为:

(let [f inc
      g #(% %2)
      gf (partial g f)]
  (gf 3))
Run Code Online (Sandbox Code Playgroud)

但我想的越多,我对问题的理解就越少.

你能描述一下你真正想要达到的目标吗?