Changeset 6739


Ignore:
Timestamp:
Jun 15, 2007, 5:57:39 PM (17 years ago)
Author:
Gary Byers
Message:

use hash tables in #=, ##. Sometimes

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/ccl/lib/read.lisp

    r6636 r6739  
    203203        nil
    204204        (if arg
    205           (let ((pair (assoc arg %read-objects%))) ;Not assq, could be bignum!
     205          (let ((pair
     206                 (if (listp %read-objects%)
     207                   (assoc arg %read-objects%) ;Not assq, could be bignum!
     208                   (gethash arg %read-objects%))))
    206209            (if pair
    207210              (cdr pair)
    208211              (%err-disp $xnordlbl arg)))
    209212          (%err-disp $xrdndarg char)))))
     213
     214(defparameter *alist-hash-table-cutoff* 32)
    210215
    211216(set-dispatch-macro-character
     
    215220     (cond (*read-suppress* (values))
    216221           ((null arg) (%err-disp $xrdndarg char))
    217            ((assoc arg %read-objects%)    ;Not assq, could be bignum!
     222           ((if (listp %read-objects%)
     223                 (assoc arg %read-objects%)    ;Not assq, could be bignum!
     224                 (gethash arg %read-objects%))
    218225            (%err-disp $xduprdlbl arg))
    219226           (t (setq lab (cons arg nil))
    220               (push (%rplacd lab lab) %read-objects%)
     227              (%rplacd lab lab)
     228              (if (listp %read-objects%)
     229                (if (< (length %read-objects%) *alist-hash-table-cutoff*)
     230                  (push lab  %read-objects%)
     231                   (let* ((new (make-hash-table :shared nil)))
     232                     (dolist (pair %read-objects%)
     233                       (setf (gethash (car pair) new) pair))
     234                     (setf (gethash arg new) lab)
     235                     (setq %read-objects% new)))
     236                (setf (gethash arg  %read-objects%) lab))
    221237              (setq form (read stream t nil t))
    222238              (when (eq form lab)   ;#n= #n#.  No can do.
     
    225241              (let ((scanned nil))
    226242                  (labels ((circle-subst (tree)
    227                              (if (memq tree %read-objects%)
     243                             (if (if (listp %read-objects%)
     244                                   (assoc tree %read-objects%)
     245                                   (gethash tree %read-objects%))
    228246                               (progn
    229247                                 (unless (memq tree scanned)
Note: See TracChangeset for help on using the changeset viewer.