Use hash table for *symbols* in reader, instead of a list.

This commit is contained in:
Jesse D. McDonald 2011-04-25 16:02:05 -05:00
parent 99da463f84
commit 9fbd3d0212
1 changed files with 5 additions and 9 deletions

View File

@ -2,7 +2,7 @@
(load "hash-table.rls") (load "hash-table.rls")
(define s:symbol (struct-type 'a)) (define s:symbol (struct-type 'a))
(define *symbols* '()) (define *symbols* (make-hash-table))
(define (make-symbol name) (define (make-symbol name)
(let ([sym (make-struct s:symbol)]) (let ([sym (make-struct s:symbol)])
@ -30,15 +30,11 @@
(define (memq? val lst) (define (memq? val lst)
(and (memq val lst) #t)) (and (memq val lst) #t))
(define (find-symbol name)
(findf (lambda (x) (byte-string= (symbol-name x) name)) *symbols*))
(define (intern name) (define (intern name)
(let ([sym (find-symbol name)]) (or (hash-table-lookup *symbols* name)
(or sym (let ([sym (make-symbol name)])
(let ([sym (make-symbol name)]) (hash-table-insert *symbols* name sym)
(set! *symbols* (cons sym *symbols*)) sym)))
sym))))
(define (read-from-fd fd) (define (read-from-fd fd)
(let/cc toplevel-return (let/cc toplevel-return