2024 Clojure状态调查中分享您的看法!

欢迎!请访问关于页面获取更多有关如何使用本网站的信息。

+1
命名空间和变量

Clojure核心语言很小。更高级的语法通常是通过宏来实现的,这些宏会展开成一系列核心特殊形式。其中一个特殊符号是def,用于在当前命名空间中内联Vars。然而,也存在一个做几乎同样事情的intern函数,并且只使用一些集成操作。

def为什么要成为特殊形式?有其他用例需要def而不仅仅是用intern和一些集成操作或宏来实现吗?

1 个回答

0

defmacro展开为defn,而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=>
```
...