clojure - 为什么 Clojure 的 gensym 在每次调用时增加 3?

标签 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

我已经看到并理解 atom 的组合使用和 inc ,但我是 gensym 的新手功能。

最佳答案

这里有许多正确的答案。一是:没有!

user> (take 5 (repeatedly gensym))
(G__2173 G__2174 G__2175 G__2176 G__2177)

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

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

关于clojure - 为什么 Clojure 的 gensym 在每次调用时增加 3?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23596043/

相关文章:

emacs - 使用 Paredit 包装现有表达式

clojure - 在 clojure 列表中转发填充 nil 值的更好方法

clojure - 如何在 clojure 中为变量重新分配另一个值

clojure - Clojure 中 Joda 时间的自定义 Transit 编写器

clojure - 两个函数相互递归调用

clojure - 为 ANTLR 语法编写解释器

clojure - 统一访问具有概率字段的 Clojure 记录

map - Clojure,将一个函数映射到两个参数,一个参数是固定的,另一个从列表中获取

clojure - 当多态性(还)不是问题时我应该使用协议(protocol)吗?

clojure - 如果像 Dylan、Julia 和 Seph 那样放弃前导括号,Clojure 会失去什么?