Clojure中常见Lisp的PROGV

时间:2015-09-20 23:30:54

标签: clojure

Common Lisp有一个名为progv的函数,它为给定符号和值列表的表单建立动态绑定。我为Clojure做了类似的事情。我很确定这在核心语言中并不存在。我想知道我最好的选择是什么。

1 个答案:

答案 0 :(得分:3)

这是使用绑定的示例:

user> (def ^:dynamic add +)
#'user/add
user> (binding [add -]
        (add 42 41))
1

因为动态绑定存在效率成本,最近版本的clojure要求您添加元数据 到每个期望动态绑定的符号。

绑定只是函数push-thread-bindingspop-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

确保你正确推送和弹出,或者真的难以调试。