为什么Clojure的每次通话时的gensym增加3?

Che*_*het 4 clojure

对lisps相当新,但在查看顺序整数生成代码时,我注意到重复调用(gensym)会使前缀后面提供的数字增加3.我很好奇为什么会这样.

user=> (gensym)
G__662
user=> (gensym)
G__665
user=> (gensym)
G__668
user=> (gensym)
G__671
user=> (gensym)
G__674
user=> (gensym)
G__677
Run Code Online (Sandbox Code Playgroud)

我已经看到和理解的结合使用的atominc,但我是新来的gensym功能.

ama*_*loy 12

这里有很多正确的答案.一个是:它没有!

user> (take 5 (repeatedly gensym))
(G__2173 G__2174 G__2175 G__2176 G__2177)
Run Code Online (Sandbox Code Playgroud)

另一个原因是:gensym对它生成的符号形式没有任何保证,所以你真的不应该关心它们是否是顺序的(或者即使它们包含数字).你当然不应该劫持gensym来产生一个整数序列.

最后:为什么它在你的例子中增加了三个?因为每次在repl中评估表单时,编译器都必须创建自己的一些gensyms.显然,对于表单(gensym),它需要创建的数字是两个.