Common Lisp有一个名为progv的函数,它为给定符号和值列表的表单建立动态绑定。我为Clojure做了类似的事情。我很确定这在核心语言中并不存在。我想知道我最好的选择是什么。
答案 0 :(得分:3)
这是使用绑定的示例:
user> (def ^:dynamic add +)
#'user/add
user> (binding [add -]
(add 42 41))
1
因为动态绑定存在效率成本,最近版本的clojure要求您添加元数据 到每个期望动态绑定的符号。
绑定只是函数push-thread-bindings
和pop-thread-bindings
的包装器,所以如果你想动态构建这样的绑定,你可以自己调用这些函数:
user> (defn with-alternate-addition [number1 number2 addition-function]
(push-thread-bindings {#'add addition-function})
(try
(add number1 number2)
(finally (pop-thread-bindings))))
#'user/with-alternate-addition
user> (with-alternate-addition 42 41 -)
1
确保你正确推送和弹出,或者真的难以调试。