(FILECREATED "19-Sep-86 16:43:48" {ERIS}<LISPCORE>LIBRARY>CMLSTRUCT.;43 22623
changes to: (FUNCTIONS DEFSTRUCT)
previous date: "12-Sep-86 19:41:23" {ERIS}<LISPCORE>LIBRARY>CMLSTRUCT.;42)
(* Copyright (c) 1985, 1986 by Xerox Corporation. All rights reserved.)
(PRETTYCOMPRINT CMLSTRUCTCOMS)
(RPAQQ CMLSTRUCTCOMS ((* * this is the baby defstruct used to bootstrap PCL)
(FUNCTIONS SLOT-NAME)
(FNS DEFAULT-STRUCTURE-PRINTER LOCAL-SLOT-LIST \DEFPRINT.DEFSTRUCT.DEFAULT
\CMLSTRUCT.CLTYPE.TO.ILTYPE SLOT-LIST SUBSTITUTE-SLOTS
STRUCTURE-CONSTRUCTOR CREATE-STRUCTURE CONSTRUCTOR-DEFUN)
(DEFINE-TYPES STRUCTURES)
(SETFS INCLUDED-STRUCTURE)
(FNS INCLUDED-STRUCTURE)
(FUNCTIONS DEFSTRUCT)
(PROP FILETYPE CMLSTRUCT)
(OPTIMIZERS STRUCTURE-CONSTRUCTOR)
(DECLARE: DONTEVAL@LOAD DOEVAL@COMPILE DONTCOPY COMPILERVARS
(ADDVARS (NLAMA)
(NLAML)
(LAMA CREATE-STRUCTURE STRUCTURE-CONSTRUCTOR SUBSTITUTE-SLOTS
SLOT-LIST LOCAL-SLOT-LIST DEFAULT-STRUCTURE-PRINTER)))))
(* * this is the baby defstruct used to bootstrap PCL)
(DEFMACRO SLOT-NAME (SLOT-DESC) (BQUOTE (CL:IF (CL:ATOM (\, SLOT-DESC))
(\, SLOT-DESC)
(CAR (\, SLOT-DESC)))))
(DEFINEQ
(DEFAULT-STRUCTURE-PRINTER
(CL:LAMBDA (STRUC STREAM LEVEL) (* lmm " 9-May-86 18:03")
(\DEFPRINT.DEFSTRUCT.DEFAULT STRUC STREAM)))
(LOCAL-SLOT-LIST
[CL:LAMBDA (NAME) (* gbn " 6-Jul-86 18:20")
(COPY (GET NAME (QUOTE %%LOCAL-SLOT-NAMES])
(\DEFPRINT.DEFSTRUCT.DEFAULT
[LAMBDA (STRUC STREAM) (* amd "16-May-86 12:00")
(LET ((TYPE (TYPENAME STRUC)))
(\OUTCHAR STREAM (fetch (READTABLEP HASHMACROCHAR) of *READTABLE*))
(PRIN3 "S(" STREAM)
(PRIN2 TYPE STREAM)
(LET [(*PRINT-LEVEL* (AND *PRINT-LEVEL* (SUB1 *PRINT-LEVEL*]
(DECLARE (SPECVARS *PRINT-LEVEL*))
(for FIELD in (SLOT-LIST TYPE) as DESCRIPTOR in (GETDESCRIPTORS TYPE)
do (PRIN1 " " STREAM)
(PRIN2 (SLOT-NAME FIELD)
STREAM)
(PRIN1 " " STREAM)
(PRIN2 (FETCHFIELD DESCRIPTOR STRUC)
STREAM)))
(PRIN1 ")" STREAM)
T])
(\CMLSTRUCT.CLTYPE.TO.ILTYPE
[LAMBDA (ELEMENTTYPE) (* kbr: " 7-Apr-86 11:22")
(* * Returns the most specific InterLisp type descriptor which will hold a
given type.)
(* * Note: This function accepts only a limited subset of the Common Lisp type
specifiers: T FLOAT SINGLE-FLOAT FIXNUM BIT
(MOD n) (UNSIGNED-BYTE n) INTEGER (INTEGER low high) XPOINTER DOUBLE-POINTER)
(SELECTQ ELEMENTTYPE
((STRING-CHAR T)
(QUOTE POINTER))
(FIXNUM (QUOTE SIGNEDWORD))
(INTEGER (QUOTE FIXP))
(BIT (QUOTE (BITS 1)))
(XPOINTER ELEMENTTYPE)
((SINGLE-FLOAT FLOAT)
(QUOTE FLOATP))
(COND
[(AND (EQ (CAR (LISTP ELEMENTTYPE))
(QUOTE MOD))
(NULL (CDDR ELEMENTTYPE))
(FIXP (CADR ELEMENTTYPE))
(ILESSP 1 (CADR ELEMENTTYPE))) (* (MOD n) is converted to the next
higher enclosing type.)
(LET ((MOD# (CADR ELEMENTTYPE)))
(COND
[(ILEQ MOD# (LLSH 1 BITSPERWORD))
(BQUOTE (BITS (\, (INTEGERLENGTH (SUB1 MOD#]
((ILEQ MOD# MAX.FIXP)
(QUOTE FIXP))
(T (QUOTE POINTER]
[(AND (EQ (CAR (LISTP ELEMENTTYPE))
(QUOTE UNSIGNED-BYTE))
(NULL (CDDR ELEMENTTYPE))
(FIXP (CADR ELEMENTTYPE))
(ILESSP 0 (CADR ELEMENTTYPE))) (* (UNSIGNED.BYTE n) is converted to
the next higher enclosing type.)
(LET ((#BITS (CADR ELEMENTTYPE)))
(COND
[(ILEQ #BITS BITSPERWORD)
(BQUOTE (BITS (\, #BITS]
((ILEQ #BITS (CONSTANT (INTEGERLENGTH MAX.FIXP)))
(QUOTE FIXP))
(T (QUOTE POINTER]
[(AND (EQ (CAR (LISTP ELEMENTTYPE))
(QUOTE INTEGER))
(NULL (CDDDR ELEMENTTYPE))
(FIXP (CADR ELEMENTTYPE))
(FIXP (CADDR ELEMENTTYPE))
(ILESSP (CADR ELEMENTTYPE)
(CADDR ELEMENTTYPE))) (* (INTEGER low high))
(LET* ((LOW (CADR ELEMENTTYPE))
(HIGH (CADDR ELEMENTTYPE))
(RANGE (IDIFFERENCE HIGH LOW))) (* Type simplification should probably
be done somewhere else)
(COND
[(IEQP LOW 0) (* (INTEGER 0 high) =>
(MOD nbits))
(\CMLSTRUCT.CLTYPE.TO.ILTYPE (BQUOTE (MOD , (ADD1 RANGE]
((AND (IGEQ LOW MIN.FIXP)
(ILEQ HIGH MAX.FIXP)) (* (INTEGER >= MIN.FIXP <= MAX.FIXP)
== FIXNUM)
(QUOTE FIXP))
(T (QUOTE POINTER]
((EQUAL ELEMENTTYPE (QUOTE (SIMPLE-VECTOR CL:* FIXNUM)))
(QUOTE POINTER))
((FMEMB ELEMENTTYPE (USERDATATYPES))
(QUOTE POINTER))
(T (ERROR "Bad type specifier" ELEMENTTYPE])
(SLOT-LIST
[CL:LAMBDA (NAME) (* amd "16-May-86 12:03")
(COPY (GET NAME (QUOTE %%SLOT-DESCRIPTIONS])
(SUBSTITUTE-SLOTS
[CL:LAMBDA (NEWSLOTS OLDSLOTS) (* amd "16-May-86 12:11")
(if (NULL NEWSLOTS)
then OLDSLOTS
else (for OLDSLOT in OLDSLOTS collect (OR (for NEWSLOT in NEWSLOTS
thereis (AND (EQ (SLOT-NAME OLDSLOT)
(SLOT-NAME NEWSLOT))
NEWSLOT))
OLDSLOT])
(STRUCTURE-CONSTRUCTOR
(CL:LAMBDA (STRUCTURE-NAME) (* edited: " 9-May-86 11:50")
(GET STRUCTURE-NAME (QUOTE STRUCTURE-CONSTRUCTOR))))
(CREATE-STRUCTURE
[CL:LAMBDA (STRUCTURE-FORM) (* gbn "28-Apr-86 17:32")
(APPLY (STRUCTURE-CONSTRUCTOR (CAR STRUCTURE-FORM))
(for TAIL on (CDR STRUCTURE-FORM) by (CDDR TAIL) join (LIST (MAKE-KEYWORD (CAR TAIL))
(CADR TAIL])
(CONSTRUCTOR-DEFUN
[LAMBDA (X SLOT-DESCRIPTIONS NAME) (* gbn "17-Jun-86 18:35")
(LET [(KEYS (for X in SLOT-DESCRIPTIONS collect (if (NLISTP X)
then X
else (LIST (CAR X)
(CADR X]
(BQUOTE (DEFUN (\, X) ((\,@ (AND KEYS (BQUOTE (&KEY (\,@ KEYS))))))
(create (\, NAME)
(\,@ (for x in SLOT-DESCRIPTIONS join (LIST (SLOT-NAME x)
(QUOTE ←)
(SLOT-NAME x))))))
])
)
(DEF-DEFINE-TYPE STRUCTURES "Common Lisp structures" )
(DEFSETF INCLUDED-STRUCTURE (STRUCT) (INCLUDED)
(BQUOTE (PUT (\, STRUCT)
(QUOTE %%%%INCLUDED-STRUCTURE)
(\, INCLUDED))))
(DEFINEQ
(INCLUDED-STRUCTURE
[LAMBDA (STRUCT) (* gbn "17-Jun-86 18:02")
(GET STRUCT (QUOTE %%%%INCLUDED-STRUCTURE])
)
(DEFDEFINER DEFSTRUCT
STRUCTURES
(NAME &REST SLOT-DESCRIPTIONS)
(LET
((OPTIONS (COND
((LISTP NAME)
(PROG1 (CDR NAME)
(SETQ NAME (CAR NAME)))))))
(LET
((DOC (AND (STRINGP (CAR SLOT-DESCRIPTIONS))
(pop SLOT-DESCRIPTIONS)))
CLASS
(DEFAULT-CLASS (QUOTE STRUCTURE-CLASS))
(SLOTFNS)
(SLOT-NAMES)
(LOCAL-SLOT-NAMES)
(INITIALIZATION)
(INCLUDES)
(CONC-NAME (CONCAT NAME "-"))
(CONSTRUCTORS)
(PREDICATE (PACK* NAME "-P"))
(PRINT-FUNCTION (FUNCTION DEFAULT-STRUCTURE-PRINTER))
(COPIER (PACK* "COPY-" NAME))
(SLOT-LOCATIONS)
SIMPLE-CONSTRUCTOR NAMED TYPE)
(for OPTION in OPTIONS do (COND
((LISTP OPTION)
(CASE (CAR OPTION)
(:CLASS (SETQ CLASS (CADR OPTION)))
(:CONSTRUCTOR (CL:PUSH (CDR OPTION)
CONSTRUCTORS))
(:CONC-NAME (SETQ CONC-NAME (OR (CADR OPTION)
"")))
(:INCLUDE (OR INCLUDES (SETQ INCLUDES (CDR OPTION))))
(:COPIER (SETQ COPIER (CADR OPTION)))
(:PRINT-FUNCTION (SETQ PRINT-FUNCTION (CADR OPTION)))
(:PREDICATE (SETQ PREDICATE (CADR OPTION)))
(:TYPE (SETQ CLASS (PACK* (CADR OPTION)
"-CLASS")))
(:INITIAL-OFFSET (CL:ERROR
":INITIAL-OFFSET unimplemented for DEFSTRUCT"
))
(OTHERWISE (CL:ERROR "Bad option to defstruct: ~S." OPTION))
))
(T (CASE OPTION (:NAMED (SETQ NAMED T))
(OTHERWISE (CL:ERROR "Bad option to defstruct: ~S." OPTION
))))))
(CL:IF (NOT CLASS)
(CL:SETQ CLASS DEFAULT-CLASS))
(for S in SLOT-DESCRIPTIONS do (CL:PUSH (SLOT-NAME S)
LOCAL-SLOT-NAMES))
(* ;
"There should be a check here to ensure that only the same type is included")
(SETQ SLOT-LOCATIONS (for S in LOCAL-SLOT-NAMES collect (CONS S NAME)))
(* ;
"now build up a list of slots together with the structure that they are directly inherited from.")
(if INCLUDES
then (DESTRUCTURING-BIND (INCL-NAME &REST INCL-SLOT-DESCS)
INCLUDES
(LET ((INCLUDED-DEF (GETDEF INCL-NAME (QUOTE STRUCTURES))))
(CL:IF (NOT INCLUDED-DEF)
(CL:ERROR
"~A can not be included because it has no structure definition"
INCL-NAME))
(* ;
"insure that the included structure has the right type")
(LET ((SUPER-CLASS (CADR (CL:ASSOC (QUOTE :TYPE)
(MKLIST (CADR INCLUDED-DEF))))))
(CL:SETQ SUPER-CLASS (CL:IF SUPER-CLASS (PACK* SUPER-CLASS "-CLASS")
DEFAULT-CLASS))
(CL:IF (NOT (EQ SUPER-CLASS CLASS))
(CL:ERROR "Can't include ~A because it is not of type ~A"
INCLUDES CLASS))))
(SETQ SLOT-DESCRIPTIONS (CONCATENATE (QUOTE LIST)
(SUBSTITUTE-SLOTS INCL-SLOT-DESCS (SLOT-LIST
INCL-NAME))
SLOT-DESCRIPTIONS))
(SELECTQ CLASS
(LIST-CLASS NIL)
(STRUCTURE-CLASS
(DESTRUCTURING-BIND (INCL-NAME &REST INCL-SLOT-DESCS)
INCLUDES
(push INITIALIZATION (BQUOTE (INCLUDES (\, INCL-NAME))))
(* ;
"now build up a list of slots together with the structure that they are directly inherited from.")
(for (SUPER ← INCL-NAME) by (INCLUDED-STRUCTURE SUPER)
while SUPER do (for S in (LOCAL-SLOT-LIST SUPER)
do (CL:PUSH (CONS S SUPER)
SLOT-LOCATIONS)))))
(CL:ERROR ":INCLUDE is not supported for type ~A" CLASS))))
(for X in (REVERSE SLOT-DESCRIPTIONS) do (CL:PUSH (SLOT-NAME X)
SLOT-NAMES)
(CL:WHEN (CADR (LISTP X))
(pushlist INITIALIZATION
(BQUOTE ((\, (SLOT-NAME X))←
(\, (CADR X)))))))
(* ;;;
"make slot accessor and settor fns and dmacros")
(* ;; "(USERRECLST (LIST (BQUOTE ((\, (SELECTQ CLASS ((NIL STRUCTURE) (QUOTE DATATYPE)) (LIST-CLASS (if NAMED then (QUOTE TYPERECORD) else (QUOTE RECORD))) (VECTOR (QUOTE ARRAYRECORD)) (CL:ERROR `Illegal type: ~S in DEFSTRUCT.' CLASS))) (\, NAME) (\, SLOT-NAMES) (\,@ INITIALIZATION)))))")
(push USERRECLST (BQUOTE ((\, (SELECTQ CLASS
(STRUCTURE-CLASS
(QUOTE DATATYPE))
(LIST-CLASS (if NAMED
then (QUOTE TYPERECORD)
else (QUOTE RECORD)))
(VECTOR (QUOTE ARRAYRECORD))
(CL:ERROR "Illegal type: ~S in DEFSTRUCT." CLASS)))
(\, NAME)
(\, SLOT-NAMES)
(\,@ INITIALIZATION))))
(PROGN
(for SLOT-DESC in SLOT-DESCRIPTIONS
do (DESTRUCTURING-BIND
(SLOT-NAME SLOT-INIT &KEY READ-ONLY &ALLOW-OTHER-KEYS)
(MKLIST SLOT-DESC)
(LET ((ACCESSOR (PACK* CONC-NAME SLOT-NAME))
(SLOT-LOCATION (SELECTQ CLASS
(LIST-CLASS NAME)
(STRUCTURE-CLASS
(OR (CDR (CL:ASSOC SLOT-NAME SLOT-LOCATIONS))
(CL:ERROR "slot-location unknown inside defstruct: ~A"
SLOT-NAME)))
(CL:ERROR ":INCLUDE is not supported for type ~A" CLASS))))
(pushlist SLOTFNS
(BQUOTE ((DEFUN (\, ACCESSOR) (OBJECT) (fetch ((\, SLOT-LOCATION)
(\, SLOT-NAME)) of OBJECT))
(\,@ (CL:UNLESS READ-ONLY
(LET ((SETTER (PACK* "setf-" ACCESSOR)))
(BQUOTE ((DEFUN (\, SETTER) (OBJECT VALUE)
(replace ((\, SLOT-LOCATION)
(\, SLOT-NAME))
OBJECT VALUE))
(DEFSETF (\, ACCESSOR) (\, SETTER) )
)))))))))))
(BQUOTE
(PROGN
(\,@ SLOTFNS)
(\,@ (CASE CLASS (LIST-CLASS (* ; "do nothing, no predicate is defined")
NIL)
(STRUCTURE-CLASS (BQUOTE ((DEFUN (\, PREDICATE) (OBJECT)
(\INSTANCE-P OBJECT (QUOTE (\, NAME))))
)))
(OTHERWISE (BQUOTE ((DEFUN (\, PREDICATE) (OBJECT) (type? (\, NAME)
OBJECT))
)))))
(\,@ (AND COPIER (BQUOTE ((DEFUN (\, COPIER) (OBJECT) (create (\, NAME) using OBJECT))
))))
(\,@ (AND PRINT-FUNCTION
(BQUOTE ((DEFPRINT (QUOTE (\, NAME))
(\, (if (EQ PRINT-FUNCTION (QUOTE DEFAULT-STRUCTURE-PRINTER))
then (QUOTE (FUNCTION \DEFPRINT.DEFSTRUCT.DEFAULT))
else (BQUOTE (FUNCTION (LAMBDA (X STREAM)
(APPLY* (FUNCTION (\, PRINT-FUNCTION
))
X STREAM 0)
T))))))))))
(\,@
(for CONSTRUCTOR in CONSTRUCTORS
collect
(if (CDR CONSTRUCTOR)
then (DESTRUCTURING-BIND
(CONSTRUCTOR-NAME CONSTRUCTOR-ARGS)
CONSTRUCTOR
(BQUOTE (DEFUN (\, CONSTRUCTOR-NAME) (\, CONSTRUCTOR-ARGS)
(create (\, NAME)
(\,@ (for x in CONSTRUCTOR-ARGS
join (COND
((FMEMB x (QUOTE (&KEY &OPTIONAL &REST)))
NIL)
((LISTP x)
(LIST (CAR x)
(QUOTE ←)
(CAR x)))
(T (LIST x (QUOTE ←)
x)))))))
))
else (CONSTRUCTOR-DEFUN (SETQ SIMPLE-CONSTRUCTOR (CAR CONSTRUCTOR))
SLOT-DESCRIPTIONS NAME))
finally (OR SIMPLE-CONSTRUCTOR (push $$VAL (CONSTRUCTOR-DEFUN (SETQ SIMPLE-CONSTRUCTOR
(if CONSTRUCTORS
then (PACK*
"%%internal-make-"
NAME)
else (PACK* "MAKE-" NAME
)))
SLOT-DESCRIPTIONS NAME)))))
(\,@ (CL:IF INCLUDES (BQUOTE ((SETF (INCLUDED-STRUCTURE (QUOTE (\, NAME)))
(QUOTE (\, INCLUDES)))))))
(PUTPROP (QUOTE (\, NAME))
(QUOTE STRUCTURE-CONSTRUCTOR)
(QUOTE (\, SIMPLE-CONSTRUCTOR)))
(PUTPROP (QUOTE (\, NAME))
(QUOTE %%SLOT-DESCRIPTIONS)
(QUOTE (\, SLOT-DESCRIPTIONS)))
(PUTPROP (QUOTE (\, NAME))
(QUOTE %%LOCAL-SLOT-NAMES)
(QUOTE (\, LOCAL-SLOT-NAMES)))
(\,@ (APPLY* (QUOTE RECORDALLOCATIONS)
NAME))))))))
(PUTPROPS CMLSTRUCT FILETYPE COMPILE-FILE)
(DEFOPTIMIZER STRUCTURE-CONSTRUCTOR (STRUCTURE-NAME) (BQUOTE (GETPROP (\, STRUCTURE-NAME)
(QUOTE STRUCTURE-CONSTRUCTOR))))
(DECLARE: DONTEVAL@LOAD DOEVAL@COMPILE DONTCOPY COMPILERVARS
(ADDTOVAR NLAMA )
(ADDTOVAR NLAML )
(ADDTOVAR LAMA CREATE-STRUCTURE STRUCTURE-CONSTRUCTOR SUBSTITUTE-SLOTS SLOT-LIST LOCAL-SLOT-LIST
DEFAULT-STRUCTURE-PRINTER)
)
(PUTPROPS CMLSTRUCT COPYRIGHT ("Xerox Corporation" 1985 1986))
(DECLARE: DONTCOPY
(FILEMAP (NIL (1643 8537 (DEFAULT-STRUCTURE-PRINTER 1653 . 1831) (LOCAL-SLOT-LIST 1833 . 2001) (
\DEFPRINT.DEFSTRUCT.DEFAULT 2003 . 2832) (\CMLSTRUCT.CLTYPE.TO.ILTYPE 2834 . 6412) (SLOT-LIST 6414 .
6572) (SUBSTITUTE-SLOTS 6574 . 7162) (STRUCTURE-CONSTRUCTOR 7164 . 7346) (CREATE-STRUCTURE 7348 . 7721
) (CONSTRUCTOR-DEFUN 7723 . 8535)) (8861 9039 (INCLUDED-STRUCTURE 8871 . 9037)))))
STOP