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)
虽然这确实有效,但我很惊讶没有更高级别的形式.我到处都看了,但找不到任何东西.
您要搜索的功能短语是(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提供的函数列表相似.