【发布时间】:2018-11-19 15:44:25
【问题描述】:
我正在使用 clojure 宏,我发现我可以通过函数组合来复制很多宏行为。
线程宏就是一个很好的例子:
(defn add1 [n] (+ n 1))
(defn mult10 [n] (* n 10))
(defn threadline [arg]
(-> arg
add1
mult10))
我可以用像管道这样的高阶函数轻松地复制它:
(defn pipe [& fns]
(reduce (fn [f g] (fn [arg] (g(f arg)))) fns))
(def pipeline
(pipe
#(+ % 1)
#(* % 10)))
必须存在不能用函数替换宏的情况。我想知道是否有人有这类情况的一些很好的例子,以及所涉及的反复出现的主题。
【问题讨论】:
-
理论上,任何人都可以做其他人的工作,无论是图灵完备还是全部。但是,您是否愿意是另一回事。
-
@dsm 不正确。宏不必评估所有参数,但函数可以。此外,宏不能传递给高阶函数,例如
map,但函数可以。 -
不,他们没有。你有懒惰的 eval 和 lanbda
-
*lambda - 傻胖的粗短手指...