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