(import-module "sys-utility")
(in-package "AxiomCore")
(in-package "BOOT")
(defstruct database
abbreviation
ancestors
constructor
constructorcategory
constructorkind
constructormodemap
cosig
defaultdomain
modemaps
object
operationalist
documentation
constructorform
attributes
predicates
sourcefile
parents
users
dependents
superdomain
instantiations
compiler-data
load-path
capsule-definitions
template
lookup-function
optable
)
(deftype |%Database| nil 'database)
(defmacro |dbAbbreviation| (db)
`(database-abbreviation ,db))
(defmacro |dbConstructor| (db)
`(database-constructor ,db))
(defmacro |dbConstructorKind| (db)
`(database-constructorkind ,db))
(defmacro |dbConstructorForm| (db)
`(database-constructorform ,db))
(defmacro |dbOperations| (db)
`(database-operationalist ,db))
(defmacro |dbModemaps| (db)
`(database-modemaps ,db))
(defmacro |dbConstructorModemap| (db)
`(database-constructormodemap ,db))
(defmacro |dbDualSignature| (db)
`(database-cosig ,db))
(defmacro |dbSuperDomain| (db)
`(database-superdomain ,db))
(defmacro |dbCategory| (db)
`(database-constructorcategory ,db))
(defmacro |dbPrincipals| (db)
`(database-parents ,db))
(defmacro |dbAncestors| (db)
`(database-ancestors ,db))
(defmacro |dbDefaultDomain| (db)
`(database-defaultdomain ,db))
(defmacro |dbAttributes| (db)
`(database-attributes ,db))
(defmacro |dbPredicates| (db)
`(database-predicates ,db))
(defmacro |dbSourceFile| (db)
`(database-sourcefile ,db))
(defmacro |dbModule| (db)
`(database-object ,db))
(defmacro |dbArity| (db)
`(list-length (cdr (|dbConstructorForm| ,db))))
(defmacro |dbInstanceCache| (db)
`(database-instantiations ,db))
(defmacro |dbCompilerData| (db)
`(database-compiler-data ,db))
(defmacro |dbBeingDefined?| (db)
`(|dbCompilerData| ,db))
(defmacro |dbLoadPath| (db)
`(database-load-path ,db))
(defmacro |dbCapsuleDefinitions| (db)
`(database-capsule-definitions ,db))
(defmacro |dbTemplate| (db)
`(database-template ,db))
(defmacro |dbOperationTable| (db)
`(database-optable ,db))
(defmacro |dbLookupFunction| (db)
`(database-lookup-function ,db))
(defmacro |dbDocumentation| (db)
`(database-documentation ,db))
(defun |makeDB| (c &optional (k nil) (a nil))
(let ((db (make-database)))
(|makeConstructor| c k a)
(setf (|dbConstructor| db) c)
(setf (|dbConstructorKind| db) k)
(setf (|dbAbbreviation| db) a)
(setf (|constructorDB| c) db)))
(defvar *defaultdomain-list* '(
(|MultisetAggregate| |Multiset|)
(|FunctionSpace| |Expression|)
(|AlgebraicallyClosedFunctionSpace| |Expression|)
(|ThreeSpaceCategory| |ThreeSpace|)
(|DequeueAggregate| |Dequeue|)
(|ComplexCategory| |Complex|)
(|LazyStreamAggregate| |Stream|)
(|AssociationListAggregate| |AssociationList|)
(|QuaternionCategory| |Quaternion|)
(|PriorityQueueAggregate| |Heap|)
(|PointCategory| |Point|)
(|PlottableSpaceCurveCategory| |Plot3D|)
(|PermutationCategory| |Permutation|)
(|StringCategory| |String|)
(|FileNameCategory| |FileName|)
(|OctonionCategory| |Octonion|)))
(defvar *operation-hash* nil
"given an operation name, what are its modemaps?")
(defvar *miss* nil
"if true print out cache misses on getdatabase calls")
(defvar *interp-stream* nil
"an open stream to the interpreter database")
(defvar *interp-stream-stamp* 0
"*interp-stream* (position . time)")
(defvar *operation-stream*
nil "the stream to operation.daase")
(defvar *operation-stream-stamp* 0
"*operation-stream* (position . time)")
(defvar *browse-stream* nil
"an open stream to the browser database")
(defvar *browse-stream-stamp* 0
"*browse-stream* (position . time)")
(defvar *category-stream* nil
"an open stream to the category table")
(defvar *category-stream-stamp* 0
"*category-stream* (position . time)")
(defvar *allconstructors* nil
"a list of all the constructors in the system")
(defvar *allOperations* nil
"a list of all the operations in the system")
(defvar |$ConstructorCache| nil)
(defun |closeAllDatabaseStreams| nil
(close *interp-stream*)
(close *operation-stream*)
(close *category-stream*)
(close *browse-stream*))
(defun |fillDatabasesInCore| nil
"set all -hash* to clean values. used to clean up core before saving system"
(setq |$HasCategoryTable| (make-hash-table :test #'equal))
(setq *operation-hash* (make-hash-table))
(setq *allconstructors* nil)
(setq *interp-stream-stamp* '(0 . 0))
(interpopen)
(setq *operation-stream-stamp* '(0 . 0))
(operationopen)
(setq *browse-stream-stamp* '(0 . 0))
(browseopen)
(setq *category-stream-stamp* '(0 . 0))
(categoryopen)
#+:AKCL (gbc t)
)
(defun interpOpen ()
"open the interpreter database and hash the keys"
(let (constructors pos stamp dbstruct)
(setq *interp-stream* (open (|pathToDatabase| "interp.daase")))
(setq stamp (read *interp-stream*))
(unless (equal stamp *interp-stream-stamp*)
(when |$verbose|
(format t " Re-reading interp.daase"))
(setq *interp-stream-stamp* stamp)
(setq pos (car stamp))
(file-position *interp-stream* pos)
(setq constructors (read *interp-stream*))
(dolist (item constructors)
(setq *allconstructors* (adjoin (first item) *allconstructors*))
(setq dbstruct (|makeDB| (first item) (ninth item) (seventh item)))
(setf (|dbOperations| dbstruct) (second item))
(setf (|dbModemaps| dbstruct) (fourth item))
(setf (|dbModule| dbstruct) (fifth item))
(setf (|dbCategory| dbstruct) (sixth item))
(setf (get (seventh item) 'abbreviationfor) (first item))
))
(format t "~&")))
(defun browseOpen ()
"open the constructor database and hash the keys"
(let (constructors pos stamp dbstruct)
(setq *browse-stream* (open (|pathToDatabase| "browse.daase")))
(setq stamp (read *browse-stream*))
(unless (equal stamp *browse-stream-stamp*)
(when |$verbose|
(format t " Re-reading browse.daase"))
(setq *browse-stream-stamp* stamp)
(setq pos (car stamp))
(file-position *browse-stream* pos)
(setq constructors (read *browse-stream*))
(dolist (item constructors)
(unless (setq dbstruct (|constructorDB| (car item)))
(format t "browseOpen:~%")
(format t "the browse database contains a constructor ~a~%" item)
(format t "that is not in the interp.daase file. we cannot~%")
(format t "get the database structure for this constructor and~%")
(warn "will create a new one~%")
(setq dbstruct (|makeDB| (first item)))
(setq *allconstructors* (adjoin item *allconstructors*)))
(setf (|dbSourceFile| dbstruct) (second item))
(setf (database-documentation dbstruct) (fourth item))
))
(format t "~&")))
(defun categoryOpen ()
"open category.daase and hash the keys"
(let (pos keys stamp)
(setq *category-stream* (open (|pathToDatabase| "category.daase")))
(setq stamp (read *category-stream*))
(unless (equal stamp *category-stream-stamp*)
(when |$verbose|
(format t " Re-reading category.daase"))
(setq *category-stream-stamp* stamp)
(setq pos (car stamp))
(file-position *category-stream* pos)
(setq keys (read *category-stream*))
(setq |$HasCategoryTable| (make-hash-table :test #'equal))
(dolist (item keys)
(setf (gethash (first item) |$HasCategoryTable|) (second item))))
(format t "~&")))
(defun operationOpen ()
"read operation database and hash the keys"
(let (operations pos stamp)
(setq *operation-stream* (open (|pathToDatabase| "operation.daase")))
(setq stamp (read *operation-stream*))
(unless (equal stamp *operation-stream-stamp*)
(when |$verbose|
(format t " Re-reading operation.daase"))
(setq *operation-stream-stamp* stamp)
(setq pos (car stamp))
(file-position *operation-stream* pos)
(setq operations (read *operation-stream*))
(dolist (item operations)
(setf (gethash (car item) *operation-hash*) (cdr item))))
(format t "~&")))
(defun addoperations (constructor oldmaps)
"add ops from a )library domain to *operation-hash*"
(declare (special *operation-hash*))
(dolist (map oldmaps)
(let (oldop op)
(setq op (car map))
(setq oldop (|getOperationFromDB| op))
(setq oldop (delete (cdr map) oldop :test #'equal))
(setf (gethash op *operation-hash*) oldop)))
(dolist (map (|getOperationModemapsFromDB| constructor))
(let (op newmap)
(setq op (car map))
(setq newmap (|getOperationFromDB| op))
(setf (gethash op *operation-hash*) (cons (cdr map) newmap)))))
(defun showdatabase (constructor)
(format t "~&~a: ~a~%" 'constructorkind
(|getConstructorKindFromDB| constructor))
(format t "~a: ~a~%" 'cosig
(|getDualSignature| constructor))
(format t "~a: ~a~%" 'operation
(|getOperationFromDB| constructor))
(format t "~a: ~%" 'constructormodemap)
(pprint (|getConstructorModemap| constructor))
(format t "~&~a: ~%" 'constructorcategory)
(pprint (|getConstructorCategory| constructor))
(format t "~&~a: ~%" 'operationalist)
(pprint (|getConstructorOperationsFromDB| constructor))
(format t "~&~a: ~%" 'modemaps)
(pprint (|getOperationModemapsFromDB| constructor))
(format t "~a: ~a~%" 'hascategory
(|constructorHasCategoryFromDB| constructor))
(format t "~a: ~a~%" 'object
(|getConstructorModuleFromDB| constructor))
(format t "~a: ~a~%" 'abbreviation
(|getConstructorAbbreviationFromDB| constructor))
(format t "~a: ~a~%" 'constructor?
(|getConstructorOperationsFromDB| constructor))
(format t "~a: ~a~%" 'constructor
(|getConstructorFullNameFromDB| constructor))
(format t "~a: ~a~%" 'defaultdomain
(|getConstructorDefaultFromDB| constructor))
(format t "~a: ~a~%" 'ancestors
(|getConstructorAncestorsFromDB| constructor))
(format t "~a: ~a~%" 'sourcefile
(|getConstructorSourceFileFromDB| constructor))
(format t "~a: ~a~%" 'constructorform
(|getConstructorFormFromDB| constructor))
(format t "~a: ~a~%" 'constructorargs
(|getConstructorArgs| constructor))
(format t "~a: ~a~%" 'attributes
(|getConstructorAttributes| constructor))
(format t "~a: ~%" 'predicates)
(pprint (|getConstructorPredicates| constructor))
(format t "~a: ~a~%" 'documentation
(|getConstructorDocumentationFromDB| constructor))
(format t "~a: ~a~%" 'parents
(|getConstructorParentsFromDB| constructor)))
(defun setdatabase (constructor key value)
(let (struct)
(when (symbolp constructor)
(unless (setq struct (|constructorDB| constructor))
(setq struct (|makeDB| constructor)))
(case key
(abbreviation
(setf (|dbAbbreviation| struct) value)
(when (symbolp value)
(setf (get value 'abbreviationfor) constructor)))
(superdomain
(setf (|dbSuperDomain| struct) value))
(constructorkind
(setf (|dbConstructorKind| struct) value))))))
(defun deldatabase (constructor key)
(when (symbolp constructor)
(case key
(abbreviation
(setf (get constructor 'abbreviationfor) nil)))))
(defun getdatabase (constructor key)
(declare (special *miss*))
(when (eq *miss* t)
(format t "getdatabase call: ~20a ~a~%" constructor key))
(let (data table stream ignore struct)
(declare (ignore ignore))
(when (or (symbolp constructor)
(and (eq key 'hascategory) (consp constructor)))
(let ((struct (and (symbolp constructor) (|constructorDB| constructor))))
(case key
(operation
(setq stream *operation-stream*)
(setq data (gethash constructor *operation-hash*)))
(modemaps
(setq stream *interp-stream*)
(when struct
(setq data (|dbModemaps| struct))))
(hascategory
(setq table |$HasCategoryTable|)
(setq stream *category-stream*)
(setq data (gethash constructor table)))
(object
(setq stream *interp-stream*)
(when struct
(setq data (|dbModule| struct))))
(constructor?
(|fatalError| "GETDATABASE called with CONSTRUCTOR?"))
(defaultdomain
(setq data (cadr (assoc constructor *defaultdomain-list*))))
(sourcefile
(setq stream *browse-stream*)
(when struct
(setq data (|dbSourceFile| struct))))
(documentation
(setq stream *browse-stream*)
(when struct
(setq data (database-documentation struct))))
(users
(setq stream *browse-stream*)
(when struct
(setq data (database-users struct))))
(dependents
(setq stream *browse-stream*)
(when struct
(setq data (database-dependents struct))))
(otherwise
(error "~%(GETDATABASE ~a ~a) failed~%" constructor key)))
(when (numberp data)
(when *miss*
(format t "getdatabase miss: ~20a ~a~%" key constructor))
(file-position stream data)
(setq data (read stream))
(case key
(operation
(setf (gethash constructor *operation-hash*) data))
(hascategory
(setf (gethash constructor |$HasCategoryTable|) data))
(modemaps
(setf (|dbModemaps| struct) data))
(object
(setf (|dbModule| struct) data))
(documentation
(setf (database-documentation struct) data))
(users
(setf (database-users struct) data))
(dependents
(setf (database-dependents struct) data))
(sourcefile
(setf (|dbSourceFile| struct) data))))
(case key
(sourcefile
(when (and data (string= (directory-namestring data) "")
(string= (pathname-type data) "spad"))
(setq data
(concatenate 'string
(|systemRootDirectory|)
"src/algebra/" data))))
(object
(if (consp data)
(setq data
(if (string= (directory-namestring (car data)) "")
(|getSystemModulePath| (car data))
(car data)))
(when (and data (string= (directory-namestring data) ""))
(setq data (|getSystemModulePath| data)))))))
data)))
(defun localdatabase (filelist options &optional (make-database? nil))
"read a local filename and update the hash tables"
(labels
((processOptions (options)
(let (only dir noexpose)
(when (setq only (assoc '|only| options))
(setq options (delete only options :test #'equal))
(setq only (cdr only)))
(when (setq dir (assoc '|dir| options))
(setq options (delete dir options :test #'equal))
(setq dir (second dir))
(when (null dir)
(|sayKeyedMsg| 'S2IU0002 nil) ))
(when (setq noexpose (assoc '|noexpose| options))
(setq options (delete noexpose options :test #'equal))
(setq noexpose 't) )
(when options
(format t " Ignoring unknown )library option: ~a~%" options))
(values only dir noexpose)))
(processDir (dirarg)
(let ((indexFiles (|getAllIndexPathnames| dirarg))
(aldorFiles (|getAllAldorObjectFiles| dirarg)))
(values
indexFiles
nil
))))
(let (thisdir nrlibs libs object only dir key
(|$forceDatabaseUpdate| t) noexpose)
(declare (special |$forceDatabaseUpdate|))
(setq thisdir (|getWorkingDirectory|))
(setq noexpose nil)
(multiple-value-setq (only dir noexpose) (processOptions options))
(if make-database?
(setq noexpose t))
(if dir
(multiple-value-setq (nrlibs libs)
(processDir (|ensureTrailingSlash| (string dir)))))
(dolist (file filelist)
(let ((filename (pathname-name file))
(namedir (directory-namestring file)))
(unless namedir
(setq thisdir (concatenate 'string thisdir "/")))
(cond
((setq file (probe-file
(concatenate 'string
namedir
filename
".NRLIB/"
|$IndexFilename|)))
(push (namestring file) nrlibs))
('else (format t " )library cannot find the file ~a.~%" filename)))))
(dolist (file (|reverse!| nrlibs))
(setq key (pathname-name (first (last (pathname-directory file)))))
(setq object (concatenate 'string
(directory-namestring file)
"code." |$faslType|))
(localnrlib key file object make-database? noexpose))
(HCLEAR |$ConstructorCache|))))
(defun localnrlib (key nrlib object make-database? noexpose)
"given a string pathname of an index.KAF and the object update the database"
(labels
((fetchdata (alist in index)
(let (pos)
(setq pos (third (assoc index alist :test #'string=)))
(when pos
(file-position in pos)
(read in)))))
(let (alist kind (systemdir? nil) pos
constructorform oldmaps abbrev dbstruct)
(with-open-file (in nrlib)
(file-position in (read in))
(setq alist (read in))
(setq pos (third (assoc "constructorForm" alist :test #'string=)))
(file-position in pos)
(setq constructorform (read in))
(setq key (car constructorform))
(setq oldmaps (|getOperationModemapsFromDB| key))
(setq dbstruct (|makeDB| key))
(setq *allconstructors* (adjoin key *allconstructors*))
(setf (|dbConstructorForm| dbstruct) constructorform)
(setq *allOperations* nil)
(setf (|dbModule| dbstruct) object)
(setq abbrev
(intern (pathname-name (first (last (pathname-directory object))))))
(setf (|dbAbbreviation| dbstruct) abbrev)
(setf (get abbrev 'abbreviationfor) key)
(setf (|dbOperations| dbstruct) nil)
(setf (|dbOperations| dbstruct)
(fetchdata alist in "operationAlist"))
(setf (|dbConstructorModemap| dbstruct)
(fetchdata alist in "constructorModemap"))
(setf (|dbModemaps| dbstruct)
(fetchdata alist in "modemaps"))
(setf (|dbSourceFile| dbstruct)
(fetchdata alist in "sourceFile"))
(when make-database?
(setf (|dbSourceFile| dbstruct)
(file-namestring (|dbSourceFile| dbstruct))))
(setf (|dbConstructorKind| dbstruct)
(setq kind (fetchdata alist in "constructorKind")))
(setf (|dbCategory| dbstruct)
(fetchdata alist in "constructorCategory"))
(setf (database-documentation dbstruct)
(fetchdata alist in "documentation"))
(setf (|dbAttributes| dbstruct)
(fetchdata alist in "attributes"))
(setf (|dbPredicates| dbstruct)
(fetchdata alist in "predicates"))
(setf (|dbSuperDomain| dbstruct)
(fetchdata alist in "superDomain"))
(addoperations key oldmaps)
(unless make-database?
(|updateDatabase| key key systemdir?)
(|installConstructor| key kind)
(|updateCategoryTable| key kind)
(if |$InteractiveMode|
(setq |$CategoryFrame| |$EmptyEnvironment|)))
(setf (|dbDualSignature| dbstruct)
(fetchdata alist in "dualSignature"))
(setf (|dbLoadPath| (|constructorDB| key)) nil)
(if (null noexpose)
(|setExposeAddConstr| (cons key nil)))
(setf (symbol-function key)
#'(lambda (&rest args)
(unless (|dbLoaded?| (|constructorDB| key))
(|startTimingProcess| '|load|)
(|loadLibNoUpdate| key key object))
(apply key args)))
(|sayKeyedMsg| 'S2IU0001 (list key object))))))
(defun make-databases (dirlist)
(labels (
(withSpecialConstructors ()
(setf (|constructorDB| '|Union|)
(make-database :operationalist nil :constructorkind '|domain|))
(push '|Union| *allconstructors*)
(setf (|constructorDB| '|Record|)
(make-database :operationalist nil :constructorkind '|domain|))
(push '|Record| *allconstructors*)
(setf (|constructorDB| '|Mapping|)
(make-database :operationalist nil :constructorkind '|domain|))
(push '|Mapping| *allconstructors*)
(setf (|constructorDB| '|Enumeration|)
(make-database :operationalist nil :constructorkind '|domain|))
(push '|Enumeration| *allconstructors*)
)
(final-name (root)
(concat root ".daase"))
)
(let ((ancestors-table (make-hash-table :test #'eq))
d)
(declare (special |$constructorList|))
(do-symbols (symbol)
(when (|constructorDB| symbol)
(setf (|constructorDB| symbol) nil)))
(setq |$HasCategoryTable| (make-hash-table :test #'equal))
(setq *operation-hash* (make-hash-table))
(setq *allconstructors* nil)
(withSpecialConstructors)
(localdatabase nil
(list (list '|dir| (|getWorkingDirectory|) ))
'make-database)
(dolist (dir dirlist)
(localdatabase nil
(list (list '|dir|
(namestring (probe-file
(concat "./"
dir)))))
'make-database))
#+:AKCL (|mkTopicHashTable|)
(setq |$constructorList| nil)
(|buildLibdb|)
(|dbSplitLibdb|)
(|mkUsersHashTable|)
(|saveUsersHashTable|)
(|mkDependentsHashTable|)
(|saveDependentsHashTable|)
(|buildGloss|)
(write-browsedb)
(write-operationdb)
(write-categorydb ancestors-table)
(dolist (con (|allConstructors|))
(let (dbstruct)
(when (setq dbstruct (|constructorDB| con))
(setf (|dbDualSignature| dbstruct)
(cons nil (mapcar #'|categoryForm?|
(cddar (|dbConstructorModemap| dbstruct)))))
(when (and (eq (|dbConstructorKind| dbstruct) '|category|)
(= (length (setq d (|domainsOf| (list con) NIL NIL))) 1))
(setq d (caar d))
(when (= (length d) (length (|dbConstructorForm| dbstruct)))
(format t " ~a has a default domain of ~a~%" con (car d))
(setf (|dbDefaultDomain| dbstruct) (car d)))))))
(write-interpdb ancestors-table)
#+:AKCL (write-warmdata)
(when (probe-file (final-name "interp"))
(delete-file (final-name "interp")))
(rename-file "interp.build" (final-name "interp"))
(when (probe-file (final-name "operation"))
(delete-file (final-name "operation")))
(rename-file "operation.build" (final-name "operation"))
(when (probe-file (final-name "browse"))
(delete-file (final-name "browse")))
(rename-file "browse.build"
(final-name "browse"))
(when (probe-file (final-name "category"))
(delete-file (final-name "category")))
(rename-file "category.build"
(final-name "category")))))
(defun write-interpdb (ancestors-table)
"build interp.daase from hash tables"
(let (opalistpos modemapspos cmodemappos master masterpos obj *print-pretty*
concategory categorypos kind cosig abbrev defaultdomain
ancestors ancestorspos superpos out)
(print "building interp.daase")
(setq out (open "interp.build" :direction :output))
(princ " " out)
(finish-output out)
(dolist (constructor (|allConstructors|))
(let (struct)
(setq struct (|constructorDB| constructor))
(setq opalistpos (file-position out))
(print (|dbOperations| struct) out)
(finish-output out)
(setq cmodemappos (file-position out))
(print (|dbConstructorModemap| struct) out)
(finish-output out)
(setq modemapspos (file-position out))
(print (|dbModemaps| struct) out)
(finish-output out)
(let ((entry (|dbModule| struct)))
(cond ((consp entry)
(setq obj (cons (pathname-name (car entry))
(cdr entry))))
(entry
(setq obj (pathname-name
(first (last (pathname-directory entry))))))
(t (setq obj nil))))
(setq concategory (|dbCategory| struct))
(if concategory
(progn
(setq categorypos (file-position out))
(print concategory out)
(finish-output out))
(setq categorypos nil))
(setq abbrev (|dbAbbreviation| struct))
(setq cosig (|dbDualSignature| struct))
(setq kind (|dbConstructorKind| struct))
(setq defaultdomain (|dbDefaultDomain| struct))
(setq ancestors (gethash constructor ancestors-table))
(if ancestors
(progn
(setq ancestorspos (file-position out))
(print ancestors out)
(finish-output out))
(setq ancestorspos nil))
(setq superpos
(let ((super (|dbSuperDomain| struct)))
(when super
(prog1 (file-position out)
(print (list (car super) (second super)) out)
(finish-output out)))))
(push (list constructor opalistpos cmodemappos modemapspos
obj categorypos abbrev cosig kind defaultdomain
ancestorspos superpos) master)))
(finish-output out)
(setq masterpos (file-position out))
(print master out)
(finish-output out)
(file-position out 0)
(print (cons masterpos (get-universal-time)) out)
(finish-output out)
(close out)))
(defun write-browsedb ()
"make browse.daase from hash tables"
(let (master masterpos src formpos docpos attpos predpos *print-pretty* out)
(print "building browse.daase")
(setq out (open "browse.build" :direction :output))
(princ " " out)
(finish-output out)
(dolist (constructor (|allConstructors|))
(let (struct)
(setq struct (|constructorDB| constructor))
(setq src (|dbSourceFile| struct))
(setq formpos (file-position out))
(print (|dbConstructorForm| struct) out)
(finish-output out)
(setq docpos (file-position out))
(print (database-documentation struct) out)
(finish-output out)
(setq attpos (file-position out))
(print (|dbAttributes| struct) out)
(finish-output out)
(setq predpos (file-position out))
(print (|dbPredicates| struct) out)
(finish-output out)
(push (list constructor src formpos docpos attpos predpos) master)))
(finish-output out)
(setq masterpos (file-position out))
(print master out)
(finish-output out)
(file-position out 0)
(print (cons masterpos (get-universal-time)) out)
(finish-output out)
(close out)))
(defun write-categorydb (ancestors-table)
"make category.daase from scratch. contains the $HasCategoryTable table"
(let (out master pos *print-pretty*)
(print "building category.daase")
(|generateCategoryTable| ancestors-table)
(setq out (open "category.build" :direction :output))
(princ " " out)
(finish-output out)
(maphash #'(lambda (key value)
(if (or (null value) (eq value t))
(setq pos value)
(progn
(setq pos (file-position out))
(print value out)
(finish-output out)))
(push (list key pos) master))
|$HasCategoryTable|)
(setq pos (file-position out))
(print master out)
(finish-output out)
(file-position out 0)
(print (cons pos (get-universal-time)) out)
(finish-output out)
(close out)))
(defun write-operationdb ()
(let (pos master out)
(declare (special leaves))
(setq out (open "operation.build" :direction :output))
(princ " " out)
(finish-output out)
(maphash #'(lambda (key value)
(setq pos (file-position out))
(print value out)
(finish-output out)
(push (cons key pos) master))
*operation-hash*)
(finish-output out)
(setq pos (file-position out))
(print master out)
(file-position out 0)
(print (cons pos (get-universal-time)) out)
(finish-output out)
(close out)))
(defun write-warmdata ()
"write out information to be loaded into the image at build time"
(declare (special |$topicHash|))
(with-open-file (out "warm.data" :direction :output)
(format out "(in-package \"BOOT\")~%")
(format out "(setq |$topicHash| (make-hash-table))~%")
(maphash #'(lambda (k v)
(format out "(setf (gethash '|~a| |$topicHash|) ~a)~%" k v)) |$topicHash|)))
(defun |allConstructors| ()
(declare (special *allconstructors*))
*allconstructors*)
(defun |allOperations| ()
(declare (special *allOperations*))
(unless *allOperations*
(maphash #'(lambda (k v) (declare (ignore v)) (push k *allOperations*))
*operation-hash*))
*allOperations*)