clobie的新手,试图理解表达

时间:2016-01-09 10:16:34

标签: clojure

我是clojure的新手,你能解释一下这意味着什么吗?

(defonce ^:dynamic *some-var1* nil)

我理解" defonce",但不是表达的其余部分。什么" ^"?什么"动态"? 特别是" *"在变量名?

1 个答案:

答案 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*约定表示,因此我们知道不会出现正常行为,并且可以在其他地方引用该符号之前阅读文档或研究代码。