从匿名函数调用匿名函数

时间:2012-11-06 19:10:48

标签: function clojure anonymous-function

我想使用另一个匿名函数的简写符号来调用 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

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

2 个答案:

答案 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))

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

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