将函数列表应用于值

2 lisp functional-programming clojure

我正在寻找可能在Clojure中定义的东西(事实上在Lisp世界中),但我没有足够的经验或文化来走上正确的轨道,到目前为止谷歌还没有很好的帮助.

假设我有三种简单形式:

(defn add-one   [v] (+ v 1))
(defn add-two   [v] (+ v 2))
(defn add-three [v] (+ v 3))
Run Code Online (Sandbox Code Playgroud)

出于方便,它们存储在矢量中.在现实世界中,该向量将根据上下文而变化:

(def operations
  [add-one
   add-two
   add-three])
Run Code Online (Sandbox Code Playgroud)

我也有一个初始值:

(def value 42)
Run Code Online (Sandbox Code Playgroud)

现在,我想将该向量中的所有函数应用于该值并获得组合操作的结果:

(loop [ops operations
       val value]
  (if (empty? ops)
    val
    (recur (rest ops)
           ((first ops) val))))
Run Code Online (Sandbox Code Playgroud)

虽然这确实有效,但我很惊讶没有更高级别的形式.我到处都看了,但找不到任何东西.

Thu*_*ail 7

您要搜索的功能短语是(apply comp operations):

((apply comp operations) 42)
;48
Run Code Online (Sandbox Code Playgroud)

如果你为它提供它,你的循环确实有用:42value

(loop [ops operations
       val 42]
  (if (empty? ops)
    val
    (recur (rest ops)
           ((first ops) val))))
;48
Run Code Online (Sandbox Code Playgroud)

这将以相反的顺序应用操作comp.

......正如使用reduce:

(reduce (fn [v f] (f v)) 42 operations)
;48
Run Code Online (Sandbox Code Playgroud)

如果您查看源代码comp,您会发现一般情况基本上loop与您reverse提供的函数列表相似.