34 lines
955 B
Scheme
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:
|