请在2024年Clojure状态调查!分享您的想法。

欢迎!请参阅关于页面以获得更多关于这个工作的信息。

+1
命名空间和变量

Clojure核心语言很小。更高级的语法通常使用宏来实现,这些宏扩展为数不多的核心特殊形式。其中一个特殊符号是def,用于在当前命名空间中中继Vars。但是,还有一个intern也几乎做同样的工作(除了选择命名空间),并且只使用一个函数和一些互操作性实现。

def为什么需要是特殊形式?哪些是def可以实现的用例,而这些用例不能通过intern和一些额外的互操作或宏来实现?

1 个答案

0

defmacro扩展为defn,进一步扩展为def。如果def不是特殊形式,这将如何工作?某些事情需要编译器知道以进行引导。

谢谢,虽然我不太确定这个答案是否完整。RT.java中有许多符号被引导,包括宏,如用于clojure/core.clj顶部的`ns`。我相信`def`也能得到同样的待遇。

或者它可以在 `clojure/core.clj` 的顶部进行引导,这是我的尝试:https://gist.github.com/mszajna/4ff83117f05b94418be21eb28ece4c78

除非这个符号有任何特殊之处,也就是 —— 因此有了这个问题。
by
```
user=> (def f (fn [] f))
#'user/f
user=> (intern *ns* 'h (fn [] h))
在 (REPL:1:17) 编译时发生语法错误。
无法解析符号:在该上下文中无法解析符号 h
user=>
```
...