From fd462604bd653544b7e3898d2a67d8fc4fea8e48 Mon Sep 17 00:00:00 2001 From: Matthew Flatt Date: Wed, 21 Nov 2018 20:49:28 -0700 Subject: [PATCH] cs: make `gensym` add a counter for the printed form Although the counter doesn't make the generated symbol any more distinct, it's often a helpful hint. Closes #2396 --- racket/src/cs/rumble/symbol.ss | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/racket/src/cs/rumble/symbol.ss b/racket/src/cs/rumble/symbol.ss index deedad4cb9..21c3e43578 100644 --- a/racket/src/cs/rumble/symbol.ss +++ b/racket/src/cs/rumble/symbol.ss @@ -1,15 +1,24 @@ (define gensym (case-lambda - [() (chez:gensym)] + [() (#%gensym)] [(s) (cond - [(string? s) (chez:gensym (string->immutable-string s))] - [(symbol? s) (chez:gensym (chez:symbol->string s))] + [(string? s) (#%gensym (append-gensym-counter s))] + [(symbol? s) (#%gensym (append-gensym-counter (chez:symbol->string s)))] [else (raise-argument-error 'gensym "(or/c symbol? string?)" s)])])) +(define gensym-counter (box 0)) + +(define (append-gensym-counter s) + (let loop () + (let ([c (#%unbox gensym-counter)]) + (if (#%box-cas! gensym-counter c (add1 c)) + (string-append s (number->string c)) + (loop))))) + (define/who (symbol-interned? s) (check who symbol? s) (not (gensym? s)))