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

欢迎!请查看关于页面以了解有关该行为的更多信息。

+1
命名空间和变量

Clojure核心语言很小。更高级的语法通常使用宏扩展到几个核心特殊形式来实现。其中一个特殊符号是def,用于在当前命名空间中内联Vars。然而,还有intern也几乎实现了相同的功能(除了ns的选择),并且仅用一些函数和一些互操作来实现。

为什么def值得成为一个特殊形式?是否存在一些只能通过intern和一些额外的互操作或宏才能实现,但def可以实现的用例吗?

1 答案

0

defmacro扩展到defn,再扩展到def。所以如果def不是一个特殊形式,这将如何工作?某些事情需要对编译器了解以便启动。

谢谢,尽管我不确定这个答案是否完整。在RT.java中有很多符号在启动过程中被启动,包括像`ns`这样的宏,用于`clojure/core.clj`的顶部。我敢肯定`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=>
```
...