在示例中,我看到了
(set! *unchecked-math* true)
然后完成操作。但是,功能集究竟是什么!为什么允许变异 unchecked-math 这是一个布尔值?
答案 0 :(得分:3)
set!
是一种特殊形式(即既不是函数也不是宏),它设置了线程的值 - 本地绑定的动态Var
或Java实例/静态字段。
set!
在Java中实现为核心语言的一部分:Var.java on GitHub。
你应该在clojure.org上阅读Var
和set!
,正如Ankur在评论中指出的那样:http://clojure.org/vars#set
答案 1 :(得分:1)
解释为什么set!
适用于*unchecked-math*
:
*unchecked-math*
是一个动态Var,编译器在实际开始编译之前会为其安装线程局部绑定。这个线程局部绑定由true
设置为(set! *unchecked-math* true)
。 *warn-on-reflection*
的工作方式类似。
编译器绑定的初始值只是deref
Var获得的值。特别是,如果编译器在一个线程上编译代码,该线程已经拥有与编译过程相关的动态Vars的自己的绑定,编译器将使用这些绑定的值;也就是说,它仍将安装自己的绑定,但它将使用当前值。