3

我想调用一个使用另一个匿名函数的速记符号的匿名函数。

执行以下操作不起作用,因为返回了最后一个评估:

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

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

4

2 回答 2

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)
于 2012-11-06T19:23:13.983 回答
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时候定义一个单参数函数inc使用读者的匿名函数字面量也可能会让人忘乎所以,形式let变为:

(let [f inc
      g #(% %2)
      gf (partial g f)]
  (gf 3))

但是我想得越多,我就越不理解这个问题。

你能描述一下你真正想要实现的目标吗?

于 2012-11-06T23:21:20.933 回答