(define s:symbol (struct-type 's:symbol)) (define *symbols* (make-hash-table)) (define (make-symbol name) (let ([sym (make-struct s:symbol)]) (struct-set! sym 0 (freeze! (copy-byte-string name))) (freeze! sym))) (define (symbol? x) (and (struct? x) (eq? (struct-type x) s:symbol))) (define (symbol->string sym) (struct-ref (type-check s:symbol sym) 0)) (define (string->symbol name) (or (hash-table-lookup *symbols* name) (let ([sym (make-symbol name)]) (hash-table-insert *symbols* name sym) sym))) (define *gensym-counter* 0) (define (gensym [prefix "g"]) (set! *gensym-counter* (fix+ *gensym-counter* 1)) (make-symbol (byte-string-append prefix (number->string *gensym-counter*)))) (define (register-symbols syms) (when (pair? syms) (let ([sym (car syms)]) (hash-table-insert *symbols* (symbol->string sym) sym)) (register-symbols (cdr syms)))) ; vim:set syntax=scheme sw=2 expandtab: