根据规范,def
应在当前ns(即* ns *)中内含var。但是,以下代码看起来并不像它:
(ns namespace-b)
(defn def_something []
(ns namespace-a)
(println *ns*) ;prints namespace-a as it should
(def something 1)
)
(def_something)
(println namespace-b/something) ; prints 1
(println namespace-a/something) ; throws
我想念什么?
笔记:
defn
仅用于说明目的。定义和运行匿名函数也可以正常工作。def
内部函数可能不是很习惯。但是,这只是我遇到的一个更大问题的本质。解析器已经在编译时将var插入当前名称空间,尽管不会立即绑定它:
(defn dd [] (def x 0))
x ;; => #<Unbound Unbound: #'user/x>
相关的代码段可以发现这里,与第二参数来lookupVar
触发上述实习为不存在的瓦尔这里。
然后,解析将生成引用先前创建的var的表达式,因此表达式逻辑永远不会离开当前名称空间。
TL; DR: def
是编译器以特殊方式处理的。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句