Use hash table for *symbols* in reader, instead of a list.
This commit is contained in:
parent
99da463f84
commit
9fbd3d0212
|
|
@ -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)])
|
||||||
(set! *symbols* (cons sym *symbols*))
|
(hash-table-insert *symbols* name sym)
|
||||||
sym))))
|
sym)))
|
||||||
|
|
||||||
(define (read-from-fd fd)
|
(define (read-from-fd fd)
|
||||||
(let/cc toplevel-return
|
(let/cc toplevel-return
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue