rosella/src/lib/symbols.rls

34 lines
955 B
Scheme

(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: