在球拍中的gensym

时间:2011-04-08 03:23:57

标签: scheme racket

我知道gensym可以生成符号,但似乎有一个基数的全局计数器,它可能非常大,例如,(define s (gensym 's)) s最终可能会s12345。 我想知道是否有办法重置计数器,生成的数字可能很小?如s14

1 个答案:

答案 0 :(得分:9)

没有办法做到这一点,否则会在docs中提及。您只能为新符号提供“基础”。如果您真的需要一个小型计数器,那么使用string->unreadable-symbol很容易构成您自己的gensym,例如:

(define gensym
  (let ([counter 0])
    (lambda ([x 'g])
      (if (number? x)
        (set! counter x)
        (begin0 (string->unreadable-symbol
                 (format "~a~a" x counter))
          (set! counter (add1 counter)))))))