怎么样!在clojure中实现的功能

时间:2013-12-28 09:35:47

标签: clojure

在示例中,我看到了

(set! *unchecked-math* true)

然后完成操作。但是,功能集究竟是什么!为什么允许变异 unchecked-math 这是一个布尔值?

2 个答案:

答案 0 :(得分:3)

set!是一种特殊形式(即既不是函数也不是宏),它设置了线程的值 - 本地绑定的动态Var或Java实例/静态字段。

set!在Java中实现为核心语言的一部分:Var.java on GitHub

你应该在clojure.org上阅读Varset!,正如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的自己的绑定,编译器将使用这些绑定的值;也就是说,它仍将安装自己的绑定,但它将使用当前值。