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

欢迎!请参阅关于页面以获取更多关于工作方式的信息。

+1投票
命名空间和变量

Clojure核心语言很小。更复杂的语法通常通过宏扩展到几个核心特殊形式来实现。其中一个特殊符号是def,用于在当前命名空间中内联Vars。然而,也存在intern,它几乎完成相同的任务(除了ns的选择),并且只是通过一个函数和一些互操作来实现的。

def为什么值得成为一个特殊形式?是否存在def可以实现的用例,而这些用例无法通过intern和一些额外的互操作或宏来完成?

1 个答案

0投票

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