我是clojure的新手,你能解释一下这意味着什么吗?
(defonce ^:dynamic *some-var1* nil)
我理解" defonce",但不是表达的其余部分。什么" ^"?什么"动态"? 特别是" *"在变量名?
答案 0 :(得分:10)
defonce
宏(与许多其他宏一样)允许您将一些元数据指定为第一个参数。此元数据通常用于向编译器提供有关符号使用方式的提示。
在这种情况下,提供了^:dynamic
元数据关键字,让编译器知道应该优化此符号,以便在运行时使用binding
form进行动态反弹。
星号只是让其他开发者知道符号没有以常规方式绑定的惯例。他们在那里提请注意这样一个事实,即它可能不会以你期望的方式发挥作用。
例如,binding
表单是线程本地的,符号只在表单范围内反弹。
(defonce ^:dynamic *my-var* false)
(binding [*my-var* true] *my-var*) ;; true
*my-var* ;; false
尝试从绑定外部访问*my-var*
的值可能不会返回您期望的值。
由于此表单已使用*special-var*
约定表示,因此我们知道不会出现正常行为,并且可以在其他地方引用该符号之前阅读文档或研究代码。