Clojure宏与多方法的深入解析
1. 宏的基础与规则
1.1 宏的简单实现
利用自动生成的符号,我们可以轻松正确地实现 bench
宏:
(defmacro bench [expr]
`(let [start# (System/nanoTime)
result# ~expr]
{:result result# :elapsed (- (System/nanoTime) start#)}))
在 REPL 中测试:
(bench (str "a" "b"))
-> {:elapsed 63000, :result "ab"}
1.2 宏俱乐部规则
- 规则一:避免编写宏 :宏是复杂的,如果 Clojure 中的宏对你来说都不复杂,那可能你很厉害啦。
- 规则二:仅在封装模式的唯一途径时编写宏 :也称为特殊形式规则。特殊形式具有特殊能力,如提供基本的流控制结构(
if
、recur
)、直接访问 Java(.
,new
)、创建和绑定名称(def
,let
,