1
0
mirror of synced 2026-01-26 20:31:53 +00:00

add merge in Ron's 11/21/2020 lispcore

This commit is contained in:
Larry Masinter
2020-11-21 13:24:44 -08:00
parent e9a80b1144
commit ce4eae736e
794 changed files with 117194 additions and 0 deletions

361
CLTL2/CMLHASH Normal file
View File

@@ -0,0 +1,361 @@
(DEFINE-FILE-INFO READTABLE "XCL" PACKAGE "LISP")
(IL:FILECREATED " 2-Apr-92 13:37:38" IL:|{DSK}<usr>local>lde>lispcore>sources>CMLHASH.;6| 16577
IL:|changes| IL:|to:| (IL:FUNCTIONS CL:WITH-HASH-TABLE-ITERATOR)
(IL:VARS IL:CMLHASHCOMS)
IL:|previous| IL:|date:| " 1-Apr-92 13:16:01" IL:|{DSK}<usr>local>lde>lispcore>sources>CMLHASH.;4|
)
; Copyright (c) 1985, 1986, 1987, 1989, 1990, 1992 by Venue & Xerox Corporation. All rights reserved.
(IL:PRETTYCOMPRINT IL:CMLHASHCOMS)
(IL:RPAQQ IL:CMLHASHCOMS (
(IL:* IL:|;;| "External interface")
(IL:FUNCTIONS MAKE-HASH-TABLE GETHASH MAPHASH HASH-TABLE-COUNT
HASH-TABLE-P SXHASH)
(XCL:OPTIMIZERS GETHASH HASH-TABLE-COUNT HASH-TABLE-P)
(IL:SETFS GETHASH)
(IL:FUNCTIONS CL:HASH-TABLE-REHASH-SIZE CL:HASH-TABLE-REHASH-THRESHOLD
CL:HASH-TABLE-SIZE CL:HASH-TABLE-TEST
CL:WITH-HASH-TABLE-ITERATOR)
(XCL:OPTIMIZERS CL:HASH-TABLE-REHASH-SIZE CL:HASH-TABLE-SIZE
CL:HASH-TABLE-TEST)
(IL:* IL:|;;| "Internal interface")
(IL:FUNCTIONS EQLHASHBITSFN SXHASH-PATHNAME)
(IL:DECLARE\: IL:DONTCOPY IL:DOEVAL@COMPILE (IL:VARIABLES SXHASH-MAX)
(IL:FUNCTIONS SXHASH-LIST SXHASH-STRING SXHASH-BIT-VECTOR
SXHASH-ROT))
(IL:* IL:|;;| "UFN for the SXHASH opcode (a MISCN)")
(IL:FNS SXHASH-UFN EQLHASHBITSFN-UFN %SXHASH)
(IL:FUNCTIONS CL::%SXHASH-EQUALP SXHASH-EQUALP-STRING)
(XCL:OPTIMIZERS SXHASH EQLHASHBITSFN)
(XCL:OPTIMIZERS IL:STRINGHASHBITS IL:STRING-EQUAL-HASHBITS)
(IL:PROP (IL:FILETYPE IL:MAKEFILE-ENVIRONMENT)
IL:CMLHASH)))
(IL:* IL:|;;| "External interface")
(DEFUN MAKE-HASH-TABLE (&KEY (TEST 'EQL)
(SIZE 65)
REHASH-SIZE REHASH-THRESHOLD)
(IL:* IL:\; "Edited 23-Mar-92 16:27 by jrb:")
(IL:* IL:|;;| "Creates and returns a hash table. See manual for details.")
(IF (NOT (SYMBOLP TEST))
(COND
((%EQCODEP TEST 'EQ)
(SETQ TEST 'EQ))
((%EQCODEP TEST 'EQL)
(SETQ TEST 'EQL))
((%EQCODEP TEST 'EQUAL)
(SETQ TEST 'EQUAL))
((%EQCODEP TEST 'EQUALP)
(SETQ TEST 'EQUALP))))
(ECASE TEST
(EQ (IL:HASHARRAY SIZE REHASH-SIZE))
(EQL (IL:HASHARRAY SIZE REHASH-SIZE 'EQLHASHBITSFN 'EQL))
(EQUAL (IL:HASHARRAY SIZE REHASH-SIZE 'SXHASH 'EQUAL))
(EQUALP
(IL:* IL:|;;| "NOTE: CL::%SXHASH-EQUALP has no microcode/C support and is hence SLOW")
(IL:HASHARRAY SIZE REHASH-SIZE 'CL::%SXHASH-EQUALP 'EQUALP))))
(DEFUN GETHASH (KEY HASHTABLE &OPTIONAL DEFAULT)
(IL:GETHASH KEY HASHTABLE DEFAULT T))
(DEFUN MAPHASH (FN HASH-TABLE)
"Call function with each key/value pair in the hash-table"
(IL:MAPHASH HASH-TABLE #'(LAMBDA (VALUE KEY)
(FUNCALL FN KEY VALUE)))
NIL)
(DEFUN HASH-TABLE-COUNT (HASH-TABLE)
(IL:HARRAYPROP HASH-TABLE 'IL:NUMKEYS))
(DEFUN HASH-TABLE-P (OBJECT)
(IL:TYPENAMEP OBJECT 'IL:HARRAYP))
(DEFUN SXHASH (OBJECT)
(IL:MISCN SXHASH OBJECT))
(XCL:DEFOPTIMIZER GETHASH (KEY HASHTABLE &OPTIONAL DEFAULT XCL:&CONTEXT CONTEXT)
(IF (EQ 1 (COMPILER:CONTEXT-VALUES-USED CONTEXT))
(IF DEFAULT
`(IL:GETHASH ,KEY ,HASHTABLE ,DEFAULT)
`(IL:GETHASH ,KEY ,HASHTABLE))
'COMPILER:PASS))
(XCL:DEFOPTIMIZER HASH-TABLE-COUNT (HASH-TABLE)
`(IL:HARRAYPROP ,HASH-TABLE 'IL:NUMKEYS))
(XCL:DEFOPTIMIZER HASH-TABLE-P (OBJECT)
`(IL:TYPENAMEP ,OBJECT 'IL:HARRAYP))
(DEFSETF GETHASH PUTHASH)
(DEFUN CL:HASH-TABLE-REHASH-SIZE (HASH-TABLE)
(IL:HARRAYPROP HASH-TABLE 'IL:OVERFLOW))
(DEFUN CL:HASH-TABLE-REHASH-THRESHOLD (HASH-TABLE)
1)
(DEFUN CL:HASH-TABLE-SIZE (HASH-TABLE)
(IL:HARRAYSIZE HASH-TABLE))
(DEFUN CL:HASH-TABLE-TEST (HASH-TABLE) (IL:* IL:\; "Edited 22-Mar-92 20:47 by jrb:")
(LET ((CL::TEST (IL:HARRAYPROP HASH-TABLE 'IL:EQUIVFN)))
(CASE CL::TEST
((NIL) 'EQ)
(T CL::TEST))))
(DEFMACRO CL:WITH-HASH-TABLE-ITERATOR ((CL::MNAME HASH-TABLE)
&REST CL::FORMS)
(LET ((IL:HA (GENSYM))
(IL:LASTSLOT (GENSYM))
(IL:NULLVALUE (GENSYM))
(IL:SLOT (GENSYM))
(IL:V (GENSYM)))
(IL:* IL:|;;| "The code below is actually this stuff, macroexpanded to remove references to the IL:HARRAYP record and all the grossly internal stuff in it, which aren't normally in the sysout")
(IL:* IL:|;;| "`(LET* ((,IL:HA (IL:\\\\DTEST ,HASH-TABLE 'IL:HARRAYP)) (,IL:LASTSLOT (IL:|fetch| (IL:HASHSLOT IL:NEXTSLOT) IL:|of| (IL:\\\\HASHSLOT (IL:|fetch| IL:HARRAYPBASE IL:|of| ,IL:HA) (IL:|fetch| (IL:HARRAYP IL:LASTINDEX) IL:|of| ,IL:HA)))) (,IL:NULLVALUE IL:\\\\HASH.NULL.VALUE) ,IL:SLOT ,IL:V) (FLET ((,MNAME ( (IL:|until| (EQ (IL:SETQ ,IL:SLOT (IF ,IL:SLOT (IL:|fetch| (IL:HASHSLOT IL:NEXTSLOT) IL:|of| ,IL:SLOT) (IL:|fetch| IL:HARRAYPBASE IL:|of| ,IL:HA))) ,IL:LASTSLOT) IL:|when| (IL:SETQ ,IL:V (IL:|fetch| (IL:HASHSLOT IL:VALUE) IL:|of| ,IL:SLOT)) IL:|do| (RETURN (VALUES T (IL:|fetch| (IL:HASHSLOT IL:KEY) IL:|of| ,IL:SLOT) (AND (IL:NEQ ,IL:V ,IL:NULLVALUE) ,IL:V))) IL:|finally| (RETURN NIL)))) ,@FORMS))")
`(LET* ((,IL:HA (IL:\\DTEST ,HASH-TABLE 'IL:HARRAYP))
(,IL:LASTSLOT (IL:\\ADDBASE (IL:\\ADDBASE (IL:FETCHFIELD '(IL:HARRAYP 2 IL:POINTER)
,IL:HA)
(IL:LLSH (IL:FETCHFIELD '(IL:HARRAYP 1
(IL:BITS . 15))
,IL:HA)
2))
4))
(,IL:NULLVALUE IL:\\HASH.NULL.VALUE)
,IL:SLOT
,IL:V)
(FLET ((,CL::MNAME NIL (IL:|until| (EQ (IL:SETQ ,IL:SLOT
(IF ,IL:SLOT
(IL:\\ADDBASE ,IL:SLOT 4)
(IL:FETCHFIELD '(IL:HARRAYP 2
IL:POINTER)
,IL:HA)))
,IL:LASTSLOT)
IL:|when| (IL:SETQ ,IL:V (IL:FETCHFIELD
'(NIL 2 IL:POINTER)
,IL:SLOT))
IL:|do| (RETURN (VALUES T (IL:FETCHFIELD
'(NIL 0 IL:POINTER)
,IL:SLOT)
(AND (IL:NEQ ,IL:V ,IL:NULLVALUE)
,IL:V)))
IL:|finally| (RETURN NIL))))
,@CL::FORMS))))
(XCL:DEFOPTIMIZER CL:HASH-TABLE-REHASH-SIZE (HASH-TABLE)
`(IL:HARRAYPROP ,HASH-TABLE 'IL:OVERFLOW))
(XCL:DEFOPTIMIZER CL:HASH-TABLE-SIZE (HASH-TABLE)
`(IL:HARRAYSIZE ,HASH-TABLE))
(XCL:DEFOPTIMIZER CL:HASH-TABLE-TEST (HASH-TABLE)
`(LET ((CL::TEST (IL:HARRAYPROP ,HASH-TABLE 'IL:EQUIVFN)))
(CASE CL::TEST
((NIL) 'EQ)
(T CL::TEST))))
(IL:* IL:|;;| "Internal interface")
(DEFUN EQLHASHBITSFN (OBJ)
(IL:MISCN EQLHASHBITSFN OBJ))
(DEFUN SXHASH-PATHNAME (PATHNAME)
(LET ((HASH (SXHASH-ROT (LOGXOR (%SXHASH (IL:%PATHNAME-HOST PATHNAME))
(%SXHASH (IL:%PATHNAME-DEVICE PATHNAME))))))
(SETQ HASH (SXHASH-ROT (LOGXOR HASH (%SXHASH (IL:%PATHNAME-TYPE PATHNAME)))))
(SETQ HASH (SXHASH-ROT (LOGXOR HASH (%SXHASH (IL:%PATHNAME-VERSION PATHNAME)))))
(SETQ HASH (SXHASH-ROT (LOGXOR HASH (%SXHASH (IL:%PATHNAME-DIRECTORY PATHNAME)))))
(SETQ HASH (SXHASH-ROT (LOGXOR HASH (%SXHASH (IL:%PATHNAME-NAME PATHNAME)))))))
(IL:DECLARE\: IL:DONTCOPY IL:DOEVAL@COMPILE
(DEFCONSTANT SXHASH-MAX 13)
(DEFMACRO SXHASH-LIST (LIST)
`(DO ((LIST ,LIST (CDR LIST))
(INDEX 0 (1+ INDEX))
(HASH 0))
((OR (NOT (CONSP LIST))
(EQ INDEX SXHASH-MAX))
HASH)
(SETQ HASH (SXHASH-ROT (LOGXOR HASH (%SXHASH (CAR LIST)))))))
(DEFMACRO SXHASH-STRING (STRING) (IL:* IL:\;
 "Returns hash value for a general string.")
`(DO ((I 0 (1+ I))
(LENGTH (MIN (LENGTH ,STRING)
SXHASH-MAX))
(HASH 0))
((EQ I LENGTH)
HASH)
(IL:* IL:|;;| "the spice code had a fairly general \"rotate X within integerlength of most-positive-fixnum bits, but (a) it was slow and (b) it was buggy anyway, since it assumed that most-positive-fixnum was 1 less than a power of two.")
(SETQ HASH (SXHASH-ROT (LOGXOR HASH (CHAR-INT (AREF ,STRING I)))))))
(DEFMACRO SXHASH-BIT-VECTOR (BIT-VECTOR)
`(DO ((I 0 (1+ I))
(LENGTH (MIN (LENGTH ,BIT-VECTOR)
16))
(HASH 0))
((EQ I LENGTH)
HASH)
(SETQ HASH (+ (ASH HASH 1)
(AREF ,BIT-VECTOR I)))))
(DEFMACRO SXHASH-ROT (X)
`(LET ((X ,X))
(DPB X (BYTE 9 7)
(LDB (BYTE 7 9)
X))))
)
(IL:* IL:|;;| "UFN for the SXHASH opcode (a MISCN)")
(IL:DEFINEQ
(SXHASH-UFN
(IL:LAMBDA (IL:INDEX IL:ARGCOUNT IL:ARG-PTR) (IL:* IL:\; "Edited 23-Feb-89 19:45 by jds")
(IL:* IL:|;;|
 "This is the UFN for the CL:SXHASH MISCN sub-opcode. That MISCN is being implemented on Suns.")
(%SXHASH (IL:\\GETBASEPTR IL:ARG-PTR 0))))
(EQLHASHBITSFN-UFN
(IL:LAMBDA (IL:INDEX IL:ARGCOUNT IL:ARG-PTR) (IL:* IL:\; "Edited 23-Feb-89 18:10 by jds")
(LET ((OBJ (IL:\\GETBASEPTR IL:ARG-PTR 0)))
(TYPECASE OBJ
(CHARACTER (CHAR-INT OBJ))
(INTEGER (LOGAND OBJ 65535))
(FLOAT (LOGXOR (IL:|fetch| (IL:FLOATP IL:HIWORD) IL:|of| OBJ)
(IL:|fetch| (IL:FLOATP IL:LOWORD) IL:|of| OBJ)))
(RATIO (LOGXOR (EQLHASHBITSFN (NUMERATOR OBJ))
(EQLHASHBITSFN (DENOMINATOR OBJ))))
(COMPLEX (LOGXOR (EQLHASHBITSFN (REALPART OBJ))
(EQLHASHBITSFN (IMAGPART OBJ))))
(T (IL:\\EQHASHINGBITS OBJ))))))
(%SXHASH
(IL:LAMBDA (OBJECT) (IL:* IL:\; "Edited 23-Feb-89 19:42 by jds")
(COND
((SYMBOLP OBJECT)
(IL:\\EQHASHINGBITS OBJECT))
((LISTP OBJECT)
(SXHASH-LIST OBJECT))
((NUMBERP OBJECT)
(TYPECASE OBJECT
(INTEGER (LOGAND OBJECT MOST-POSITIVE-FIXNUM))
(FLOAT (LOGXOR (IL:|fetch| (IL:FLOATP IL:HIWORD) IL:|of| OBJECT)
(IL:|fetch| (IL:FLOATP IL:LOWORD) IL:|of| OBJECT)))
(RATIO (LOGXOR (%SXHASH (NUMERATOR OBJECT))
(%SXHASH (DENOMINATOR OBJECT))))
(COMPLEX (LOGXOR (%SXHASH (REALPART OBJECT))
(%SXHASH (IMAGPART OBJECT))))))
((STRINGP OBJECT)
(SXHASH-STRING OBJECT))
((BIT-VECTOR-P OBJECT)
(SXHASH-BIT-VECTOR OBJECT))
((PATHNAMEP OBJECT)
(SXHASH-PATHNAME OBJECT))
(T (IL:\\EQHASHINGBITS OBJECT)))))
)
(DEFUN CL::%SXHASH-EQUALP (CL::OBJECT) (IL:* IL:\; "Edited 23-Mar-92 16:17 by jrb:")
(COND
((SYMBOLP CL::OBJECT)
(IL:\\EQHASHINGBITS CL::OBJECT))
((LISTP CL::OBJECT)
(SXHASH-LIST CL::OBJECT))
((NUMBERP CL::OBJECT)
(IL:* IL:|;;| "Hacks for numbers for hash key purposes:")
(IL:* IL:|;;| "FLOATs that can be coerced to integer are")
(IL:* IL:|;;| "RATIOs are coerecd to floats (it would be better to coerce non-integral FLOATs to RATIOs, but a real pain in the ass; this is probably good enough...)")
(TYPECASE CL::OBJECT
(INTEGER (LOGAND CL::OBJECT MOST-POSITIVE-FIXNUM))
(FLOAT (IF (= CL::OBJECT (FLOOR CL::OBJECT))
(MULTIPLE-VALUE-BIND (CL::MANT EXP CL::SIGN)
(INTEGER-DECODE-FLOAT CL::OBJECT)
(SETQ CL::OBJECT (ASH CL::MANT EXP))
(WHEN (MINUSP CL::SIGN)
(SETQ CL::OBJECT (IL:IMINUS CL::OBJECT)))
(LOGAND CL::OBJECT MOST-POSITIVE-FIXNUM))
(LOGXOR (IL:|fetch| (IL:FLOATP IL:HIWORD) IL:|of| CL::OBJECT)
(IL:|fetch| (IL:FLOATP IL:LOWORD) IL:|of| CL::OBJECT))))
(RATIO (LET ((CL::F (COERCE CL::OBJECT 'FLOAT)))
(LOGXOR (IL:|fetch| (IL:FLOATP IL:HIWORD) IL:|of| CL::F)
(IL:|fetch| (IL:FLOATP IL:LOWORD) IL:|of| CL::F))))
(COMPLEX (LOGXOR (%SXHASH (REALPART CL::OBJECT))
(%SXHASH (IMAGPART CL::OBJECT))))))
((STRINGP CL::OBJECT)
(SXHASH-EQUALP-STRING CL::OBJECT))
((BIT-VECTOR-P CL::OBJECT)
(SXHASH-BIT-VECTOR CL::OBJECT))
((PATHNAMEP CL::OBJECT)
(SXHASH-PATHNAME CL::OBJECT))
(T (IL:\\EQHASHINGBITS CL::OBJECT))))
(DEFMACRO SXHASH-EQUALP-STRING (STRING)
(IL:* IL:|;;| "Returns EQUALP hash value for a string")
`(DO ((I 0 (1+ I))
(LENGTH (MIN (LENGTH ,STRING)
SXHASH-MAX))
(HASH 0))
((EQ I LENGTH)
HASH)
(IL:* IL:|;;| "the spice code had a fairly general \"rotate X within integerlength of most-positive-fixnum bits, but (a) it was slow and (b) it was buggy anyway, since it assumed that most-positive-fixnum was 1 less than a power of two.")
(SETQ HASH (SXHASH-ROT (LOGXOR HASH (IL:%CHAR-UPCASE-CODE (CHAR-CODE (AREF ,STRING I))))))))
(XCL:DEFOPTIMIZER SXHASH (OBJECT)
`(IL:MISCN SXHASH ,OBJECT))
(XCL:DEFOPTIMIZER EQLHASHBITSFN (OBJECT)
`(IL:MISCN EQLHASHBITSFN ,OBJECT))
(XCL:DEFOPTIMIZER IL:STRINGHASHBITS (STRING)
`(IL:MISCN IL:STRINGHASHBITS ,STRING))
(XCL:DEFOPTIMIZER IL:STRING-EQUAL-HASHBITS (STRING)
`(IL:MISCN IL:STRING-EQUAL-HASHBITS ,STRING))
(IL:PUTPROPS IL:CMLHASH IL:FILETYPE COMPILE-FILE)
(IL:PUTPROPS IL:CMLHASH IL:MAKEFILE-ENVIRONMENT (:READTABLE "XCL" :PACKAGE "LISP"))
(IL:PUTPROPS IL:CMLHASH IL:COPYRIGHT ("Venue & Xerox Corporation" 1985 1986 1987 1989 1990 1992))
(IL:DECLARE\: IL:DONTCOPY
(IL:FILEMAP (NIL (11187 13240 (SXHASH-UFN 11200 . 11499) (EQLHASHBITSFN-UFN 11501 . 12240) (%SXHASH
12242 . 13238)))))
IL:STOP