在我看来,with-redefs可以做一切binding动态符号可以做的事情,只是它没有需要^:dynamic元数据的限制.那我什么时候应该使用另一个呢?
Ale*_*lex 17
除了需要^:dynamic元数据之外,binding还创建仅在当前线程with-redefs中可见的绑定,而由所做的绑定在所有线程中可见.因此,它with-redefs是一个非常生硬的工具,有可能影响在同一个VM中运行的其他代码.我从未见过with-redefs在测试代码之外使用,也不应该(至少在我看来).
我将总结两者之间的差异:
将var声明^:dynamic为使用耳罩来命名动态变量(例如*my-dynamic-var*)的惯例,还有一个额外的好处,即它是一种向呼叫者做广告的自我记录方式,可以动态修改代码的这一部分.
总结:在编写API和生产代码时,更喜欢^:动态和绑定.在测试中使用with-redefs,并作为最后的手段动态地改变未声明的vars超出控件的行为^:dynamic(然后谨慎使用).