1
0
mirror of https://github.com/PDP-10/its.git synced 2026-04-05 13:41:09 +00:00
Files
PDP-10.its/src/mrg/db.1149
Eric Swenson bf8f96b837 This fixes the declare command in macsyma.
Also updates a bunch of Macsyma sources to latest versions, which
was needed to get declare working with consistent sources.
Resolves #960.
2018-07-08 07:06:20 -07:00

711 lines
22 KiB
Common Lisp
Raw Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
;;;;;;;;;;;;;;;;;;; -*- Mode: Lisp; Package: Macsyma -*- ;;;;;;;;;;;;;;;;;;;
;;; (c) Copyright 1982 Massachusetts Institute of Technology ;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(macsyma-module db)
(LOAD-MACSYMA-MACROS MRGMAC)
;; This file uses its own special syntax which is set up here. The function
;; which does it is defined in LIBMAX;MRGMAC. It sets up <, >, and : for
;; structure manipulation. A major bug with this package is that the code is
;; almost completely uncommented. Someone with nothing better to do should go
;; through it, figure out how it works, and write it down.
;; Note: After recompiling all of macsyma for the Lispm it was found
;; that some files were compiled with the syntax of ":" set up
;; incorrectly. The (MODE-SYNTAX-OFF) function, which calls
;; undocumented system-internal routines evidently did not work anymore.
;; Therefore I removed the need for MODE-SYNTAX-ON from this file.
;; 7:57pm Thursday, 25 February 1982 -GJC
;; On systems which cons fixnums, a fixnum is used as a single label cell
;; and a pointer to the fixnum is passed around (i.e. the particular fixnum
;; is passed around. On systems which have immediate fixnums, a single cons
;; cell is created and the fixnum is stored in the car of the cell. Fixnums
;; are consed only in PDP-10 MacLisp and Franz Lisp.
#+(OR PDP10 Franz)
(EVAL-WHEN (EVAL COMPILE) (SSTATUS FEATURE FIXCONS))
#+NIL
(EVAL-WHEN (EVAL COMPILE) (SET-NOFEATURE 'FIXCONS))
(DECLARE (GENPREFIX DB)
;; LAB is not a special. This declares all occurrences of LAB
;; as a local or a parameter to be a fixnum. This should really
;; be done using a LOCAL-DECLARE around the entire file so as to
;; make sure any global compiler state gets undone.
#+FIXCONS (FIXNUM LAB)
(*LEXPR CONTEXT))
;; External specials
;; Please do not use DEFMVAR on these because some of them contain
;; circular list structure, and we want to be able to load in the
;; English version of the file at times. (DEFMVAR tries to print
;; out their values when the value in core is different from the
;; value in the file.) - JPG
;; Why don't you set PRINLEVEL and PRINLENGTH in your macsyma? -GJC
(DEFVAR CONTEXT 'GLOBAL)
(DEFVAR CONTEXTS NIL)
(DEFVAR CURRENT 'GLOBAL)
(DEFVAR +LABS NIL)
(DEFVAR -LABS NIL)
(DEFVAR DBTRACE NIL)
(DEFVAR DBCHECK NIL)
(DEFVAR DOBJECTS NIL)
(DEFVAR NOBJECTS NIL)
;; Internal specials
(DEFVAR MARKS 0) (DECLARE (FIXNUM MARKS))
(DEFVAR +L) (DECLARE (FIXNUM +L))
(DEFVAR -L) (DECLARE (FIXNUM -L))
(DEFVAR ULABS NIL)
(DEFVAR CONINDEX 0) (DECLARE (FIXNUM CONINDEX))
(DEFVAR CONNUMBER 50.) (DECLARE (FIXNUM CONNUMBER))
;; The most negative fixnum. On the PDP-10, this is 1_35.
(DEFVAR LAB-HIGH-BIT (ROT 1 -1))
;; One less than the number of bits in a fixnum. On the PDP-10, this is 35.
(DEFVAR LABNUMBER (1- (HAULONG LAB-HIGH-BIT)))
;; A cell with the high bit turned on.
(DEFVAR LAB-HIGH-LAB #+FIXCONS LAB-HIGH-BIT #-FIXCONS (LIST LAB-HIGH-BIT))
(DECLARE (SPECIAL +S +SM +SL -S -SM -SL LABS LPRS LABINDEX LPRINDEX WORLD *))
;; Macro for indirecting through the contents of a cell.
(DEFMACRO UNLAB (CELL)
#+FIXCONS CELL #-FIXCONS `(CAR ,CELL))
(DEFMACRO SETQ-UNLAB (CELL)
#+FIXCONS NIL
#-FIXCONS `(SETQ ,CELL (UNLAB ,CELL)))
(DEFMACRO SETQ-COPYN (CELL)
#+FIXCONS NIL
#-FIXCONS `(SETQ ,CELL (COPYN ,CELL)))
;; Conditionalize primitive functions used in this file. These are in
;; LAP for Lisp implementations which cons fixnums. This interface
;; is poorly designed since the meaning of COPYN is varies slightly
;; between systems. In one case it means "take a cell and produce a
;; new one with the same contents". In the other, it means "take an
;; immediate fixnum and return a cell containing it." As a result of
;; this, #+FIXCONS conditionalizations appear in the actual source code.
#-FIXCONS
(PROGN 'COMPILE
(DEFMACRO COPYN (N) `(LIST ,N))
(DEFMACRO IORM (CELL N)
`(RPLACA ,CELL (LOGIOR (CAR ,CELL) (CAR ,N))))
(DEFMACRO XORM (CELL N)
`(RPLACA ,CELL (LOGXOR (CAR ,CELL) (CAR ,N))))
)
;; The LAP for the PDP-10 version.
#+PDP10 (LAP-A-LIST '(
(LAP COPYN SUBR)
(MOVE TT 0 A)
(JSP T FWCONS)
(POPJ P)
NIL
(LAP IORM SUBR)
(MOVE B 0 B)
(IORM B 0 A)
(POPJ P)
NIL
(LAP XORM SUBR)
(MOVE B 0 B)
(XORM B 0 A)
(POPJ P)
NIL ))
#+Franz
(progn 'compile
(defmacro copyn (n) `(copyint* ,n))
(defmacro iorm (cell n) `(replace ,cell (logior ,cell ,n)))
(defmacro xorm (cell n) `(replace ,cell (logxor ,cell ,n))) )
(DEFPROP GLOBAL 1 CMARK)
(ARRAY CONUNMRK NIL (1+ CONNUMBER))
(ARRAY CONMARK T (1+ CONNUMBER))
(DEFMFUN MARK (X) (PUTPROP X T 'MARK))
(DEFMFUN MARKP (X) (AND (SYMBOLP X) (GET X 'MARK)))
(DEFMFUN UNMRK (X) (REMPROP X 'MARK))
(DEFUN MARKS (X) (COND ((NUMBERP X)) ((ATOM X) (MARK X)) (T (MAPC #'MARKS X))))
(DEFUN UNMRKS (X)
(COND ((NUMBERP X))
((OR (ATOM X) (NUMBERP (CAR X))) (UNMRK X))
(T (MAPC #'UNMRKS X))))
(DEFMODE TYPE ()
(ATOM (SELECTOR +LABS) (SELECTOR -LABS) (SELECTOR DATA))
SELECTOR)
(DEFMODE INDV ()
(ATOM (SELECTOR =LABS) (SELECTOR NLABS) (SELECTOR DATA) (SELECTOR IN))
SELECTOR)
(DEFMODE UNIV ()
(ATOM (SELECTOR =LABS) (SELECTOR NLABS) (SELECTOR DATA) (SELECTOR UN))
SELECTOR)
(DEFMODE DATUM ()
(ATOM (SELECTOR ULABS) (SELECTOR CON) (SELECTOR WN))
SELECTOR)
(DEFMODE CONTEXT ()
(ATOM (SELECTOR CMARK FIXNUM 0) (SELECTOR SUBC) (SELECTOR DATA)))
;; Is (COPYN 0) really needed in these next four macros instead of simply 0?
;; If the fixnum were to get clobbered, then it would seem that (LIST 0) would
;; be the correct thing to return in the #-FIXCONS case. -cwh
(DEFMACRO +LABZ (X)
`(COND ((+LABS ,X))
(T #+FIXCONS (COPYN 0) #-FIXCONS '(0))))
(DEFMACRO -LABZ (X)
`(COND ((-LABS ,X))
(T #+FIXCONS (COPYN 0) #-FIXCONS '(0))))
(DEFMACRO =LABZ (X)
`(COND ((=LABS ,X))
(T #+FIXCONS (COPYN 0) #-FIXCONS '(0))))
(DEFMACRO NLABZ (X)
`(COND ((NLABS ,X))
(T #+FIXCONS (COPYN 0) #-FIXCONS '(0))))
(DEFMACRO ULABZ (X)
`(COND ((ULABS ,X))
(T #+FIXCONS 0 #-FIXCONS '(0))))
(DEFMACRO SUBP X
#-FIXCONS (SETQ X (MAPCAR #'(LAMBDA (FORM) `(UNLAB ,FORM)) X))
`(= ,(CAR X) (LOGAND . ,X)))
(DEFUN DBNODE (X) (IF (SYMBOLP X) X (LIST X)))
(DEFUN NODEP (X) (OR (ATOM X) (MNUMP (CAR X))))
(DEFUN DBVARP (X) (GETL X '(UN EX)))
;; Is this supposed to return a fixnum or a cell?
(DEFUN LAB (N) (LSH 1 (1- N)))
(DEFUN LPR (M N)
(COND ((DO L LPRS (CDR L) (NULL L)
(IF (AND (LABEQ M (CAAAR L)) (LABEQ N (CDAAR L)))
(RETURN (CDAR L)))))
((= (SETQ LPRINDEX (1- LPRINDEX)) LABINDEX) (BREAK LPR T))
(T (SETQ LPRS (CONS (CONS (CONS M N) (LSH 1 LPRINDEX)) LPRS))
(CDAR LPRS))))
(DEFUN LABEQ (X Y) (EQUAL (LOGIOR X LAB-HIGH-BIT) (LOGIOR Y LAB-HIGH-BIT)))
(DEFUN MARKND (ND)
(COND ((+LABS ND))
((= LPRINDEX (SETQ LABINDEX (1+ LABINDEX))) (BREAK MARKND T))
(T (SETQ LABS (CONS (CONS ND (LAB LABINDEX)) LABS))
(BEG ND (LAB LABINDEX))
(CDAR LABS))))
(DEFUN DBV (X R)
(DECLARE (FIXNUM X R Y))
(DO ((L LPRS (CDR L)) (Y 0)) ((NULL L) Y)
(IF (AND (NOT (= 0 (LOGAND R (CDAR L)))) (NOT (= 0 (LOGAND X (CAAAR L)))))
(SETQ Y (LOGIOR (CDAAR L) Y)))))
(DEFUN DBA (R Y)
(DECLARE (FIXNUM X R Y))
(DO ((L LPRS (CDR L)) (X 0)) ((NULL L) X)
(IF (AND (NOT (= 0 (LOGAND R (CDAR L)))) (NOT (= 0 (LOGAND (CDAAR L) Y))))
(SETQ X (LOGIOR X (CAAAR L))))))
(DEFUN PRLAB (X)
(SETQ-UNLAB X)
(SETQ X (LET ((BASE 2)) (EXPLODEN (BOOLE 2 LAB-HIGH-BIT X))))
(DO I (\ (LENGTH X) 3) 3 (NULL X)
(DO J I (1- J) (= 0 J) (TYO (CAR X)) (SETQ X (CDR X)))
(TYO #\SP)))
(DEFUN ONP (CL LAB) (SUBP LAB (+LABZ CL)))
(DEFUN OFFP (CL LAB) (SUBP LAB (-LABZ CL)))
(DEFUN ONPU (LAB FACT) (SUBP LAB (ULABZ FACT)))
(DEFMFUN VISIBLEP (DAT) (AND (NOT (ULABS DAT)) (CNTP DAT)))
(DEFUN CANCEL (LAB DAT)
(IF (SETQ * (ULABS DAT)) (IORM * LAB)
(SETQ ULABS (CONS DAT ULABS))
(SETQ-UNLAB LAB)
(PUTPROP DAT (COPYN LAB) 'ULABS)))
(DEFUN BEG (ND LAB)
(SETQ-COPYN LAB)
(IF (QUEUE+P ND LAB)
(IF (NULL +S) (SETQ +S (NCONS ND) +SM +S +SL +S)
(SETQ +S (CONS ND +S)))))
(DEFUN BEG- (ND LAB)
(SETQ-COPYN LAB)
(IF (QUEUE-P ND LAB)
(IF (NULL -S) (SETQ -S (NCONS ND) -SM -S -SL -S)
(SETQ -S (CONS ND -S)))))
(DEFUN MID (ND LAB)
(IF (QUEUE+P ND LAB)
(IF (NULL +SM) (SETQ +S (NCONS ND) +SM +S +SL +S)
(RPLACD +SM (CONS ND (CDR +SM)))
(IF (EQ +SM +SL) (SETQ +SL (CDR +SL)))
(SETQ +SM (CDR +SM)))))
(DEFUN MID- (ND LAB)
(IF (QUEUE-P ND LAB)
(IF (NULL -SM) (SETQ -S (NCONS ND) -SM -S -SL -S)
(RPLACD -SM (CONS ND (CDR -SM)))
(IF (EQ -SM -SL) (SETQ -SL (CDR -SL)))
(SETQ -SM (CDR -SM)))))
(DEFUN END (ND LAB)
(IF (QUEUE+P ND LAB)
(IF (NULL +SL) (SETQ +S (NCONS ND) +SM +S +SL +S)
(RPLACD +SL (NCONS ND))
(SETQ +SL (CDR +SL)))))
(DEFUN END- (ND LAB)
(IF (QUEUE-P ND LAB)
(IF (NULL -SL) (SETQ -S (NCONS ND) -SM -S -SL -S)
(RPLACD -SL (NCONS ND))
(SETQ -SL (CDR -SL)))))
(DEFUN QUEUE+P (ND LAB)
(COND ((NULL (SETQ * (+LABS ND)))
(SETQ +LABS (CONS ND +LABS))
(SETQ-UNLAB LAB)
(PUT ND (COPYN (LOGIOR LAB-HIGH-BIT LAB)) '+LABS))
((SUBP LAB *) NIL)
((SUBP LAB-HIGH-LAB *) (IORM * LAB) NIL)
(T (IORM * (LOGIOR LAB-HIGH-BIT (UNLAB LAB))))))
(DEFUN QUEUE-P (ND LAB)
(COND ((NULL (SETQ * (-LABS ND)))
(SETQ -LABS (CONS ND -LABS))
(SETQ-UNLAB LAB)
(PUT ND (COPYN (LOGIOR LAB-HIGH-BIT LAB)) '-LABS))
((SUBP LAB *) NIL)
((SUBP LAB-HIGH-LAB *) (IORM * LAB) NIL)
(T (IORM * (LOGIOR LAB-HIGH-BIT (UNLAB LAB))))))
(DEFUN DQ+ ()
(IF +S (PROG2 (XORM (+LABS (CAR +S)) LAB-HIGH-LAB)
(CAR +S)
(COND ((NOT (EQ +S +SM)) (SETQ +S (CDR +S)))
((NOT (EQ +S +SL)) (SETQ +S (CDR +S) +SM +S))
(T (SETQ +S NIL +SM NIL +SL NIL))))))
(DEFUN DQ- ()
(IF -S (PROG2 (XORM (-LABS (CAR -S)) LAB-HIGH-LAB)
(CAR -S)
(COND ((NOT (EQ -S -SM)) (SETQ -S (CDR -S)))
((NOT (EQ -S -SL)) (SETQ -S (CDR -S) -SM -S))
(T (SETQ -S NIL -SM NIL -SL NIL))))))
(DEFMFUN CLEAR ()
(IF DBTRACE (MTELL "~%Clearing ~A" MARKS))
(MAPC #'(LAMBDA (L) (_ (SEL L +LABS) NIL)) +LABS)
(MAPC #'(LAMBDA (L) (_ (SEL L -LABS) NIL)) -LABS)
(MAPC #'(LAMBDA (L) (REM L 'ULABS)) ULABS)
(SETQ +S NIL +SM NIL +SL NIL -S NIL -SM NIL -SL NIL
LABS NIL LPRS NIL LABINDEX 0 LPRINDEX LABNUMBER
MARKS 0 +LABS NIL -LABS NIL ULABS NIL)
(CONTEXTMARK))
(DEFMFUN TRUEP (PAT)
(CLEAR)
(COND ((ATOM PAT) PAT)
((PROG2 (SETQ PAT (MAPCAR #'SEMANT PAT)) NIL))
((EQ (CAR PAT) 'KIND) (BEG (CADR PAT) 1) (BEG- (CADDR PAT) 1) (PROPG))
(T (BEG (CADR PAT) 1) (BEG- (CADDR PAT) 2) (BEG (CAR PAT) (LPR 1 2)) (PROPG))))
(DEFMFUN FALSEP (PAT)
(CLEAR)
(COND ((EQ (CAR PAT) 'KIND)
(BEG (CADR PAT) 1) (BEG (CADDR PAT) 1) (PROPG))))
(DEFMFUN ISP (PAT) (COND ((TRUEP PAT)) ((FALSEP PAT) NIL) (T 'UNKNOWN)))
(DEFMFUN KINDP (X Y)
(IF (NOT (SYMBOLP X)) (MERROR "KINDP called on a non-symbolic atom."))
(CLEAR) (BEG X 1)
(DO P (DQ+) (DQ+) (NULL P)
(IF (EQ Y P) (RETURN T) (MARK+ P (+LABS P)))))
(DEFMFUN TRUE* (PAT)
(LET ((DUM (SEMANT PAT))) (IF DUM (CNTXT (IND (NCONS DUM)) CONTEXT))))
(DEFMFUN FACT (FUN ARG VAL) (CNTXT (IND (DATUM (LIST FUN ARG VAL))) CONTEXT))
(DEFMFUN KIND (X Y)
(SETQ Y (DATUM (LIST 'KIND X Y))) (CNTXT Y CONTEXT) (ADDF Y X))
(DEFMFUN PAR (S Y)
(SETQ Y (DATUM (LIST 'PAR S Y))) (CNTXT Y CONTEXT)
(MAPC #'(LAMBDA (L) (ADDF Y L)) S))
(DEFMFUN DATUM (PAT) (NCONS PAT))
(DEFUN IND (DAT)
(MAPC #'(LAMBDA (L) (IND1 DAT L)) (CDAR DAT))
(MAPC #'IND2 (CDAR DAT))
DAT)
(DEFUN IND1 (DAT PAT)
(COND ((NOT (NODEP PAT)) (MAPC #'(LAMBDA (L) (IND1 DAT L)) PAT))
((OR (MARKP PAT) (EQ 'UNKNOWN PAT)))
(T (ADDF DAT PAT) (MARK PAT))))
(DEFUN IND2 (ND) (IF (NODEP ND) (UNMRK ND) (MAPC #'IND2 ND)))
(DEFMFUN ADDF (DAT ND) (_ (SEL ND DATA) (CONS DAT (SEL ND DATA))))
(DEFMFUN REMF (DAT ND) (_ (SEL ND DATA) (FDEL DAT (SEL ND DATA))))
(DEFUN FDEL (FACT DATA)
(IF (AND (EQ (CAR FACT) (CAAAR DATA))
(EQ (CADR FACT) (CADAAR DATA))
(EQ (CADDR FACT) (CADDAAR DATA)))
(CDR DATA)
(DO ((DS DATA (CDR DS)) (D)) ((NULL (CDR DS)))
(SETQ D (CAADR DS))
(COND ((AND (EQ (CAR FACT) (CAR D))
(EQ (CADR FACT) (CADR D))
(EQ (CADDR FACT) (CADDR D)))
(_ (SEL D CON DATA) (DELQ D (SEL D CON DATA)))
(RPLACD DS (CDDR DS)) (RETURN T))))
DATA))
(DEFUN SEMANTICS (PAT) (IF (ATOM PAT) PAT (LIST (SEMANT PAT))))
(DEFUN DB-MNUMP (X)
(OR (NUMBERP X)
(AND (NOT (ATOM X))
(NOT (ATOM (CAR X)))
(MEMQ (CAAR X) '(RAT BIGFLOAT)))))
(DEFUN SEMANT (PAT)
(COND ((SYMBOLP PAT) (OR (GET PAT 'VAR) PAT))
((DB-MNUMP PAT) (DINTNUM PAT))
(T (MAPCAR #'SEMANT PAT))))
(DEFMFUN DINTERNP (X)
(COND ((MNUMP X) (DINTNUM X))
((ATOM X) X)
((ASSOL X DOBJECTS))))
(DEFMFUN DINTERN (X)
(COND ((MNUMP X) (DINTNUM X))
((ATOM X) X)
((ASSOL X DOBJECTS))
(T (SETQ DOBJECTS (CONS (DBNODE X) DOBJECTS))
(CAR DOBJECTS))))
(DEFUN DINTNUM (X)
(COND ((ASSOL X NOBJECTS))
((PROGN (SETQ X (DBNODE X)) NIL))
((NULL NOBJECTS) (SETQ NOBJECTS (LIST X)) X)
((EQ '$POS (RGRP (CAR X) (CAAR NOBJECTS)))
(LET ((CONTEXT 'GLOBAL))
(FACT 'MGRP X (CAR NOBJECTS)))
(SETQ NOBJECTS (CONS X NOBJECTS)) X)
(T (DO ((L NOBJECTS (CDR L)) (CONTEXT '$GLOBAL))
((NULL (CDR L))
(LET ((CONTEXT 'GLOBAL))
(FACT 'MGRP (CAR L) X)) (RPLACD L (LIST X)) X)
(COND ((EQ '$POS (RGRP (CAR X) (CAADR L)))
(LET ((CONTEXT 'GLOBAL))
(FACT 'MGRP (CAR L) X) (FACT 'MGRP X (CADR L)))
(RPLACD L (CONS X (CDR L)))
(RETURN X)))))))
(DEFMFUN DOUTERN (X) (IF (ATOM X) X (CAR X)))
(DEFMFUN UNTRUE (PAT)
(KILL (CAR PAT) (SEMANT (CADR PAT)) (SEMANT (CADDR PAT))))
(DEFMFUN KILL (FUN ARG VAL) (KILL2 FUN ARG VAL ARG) (KILL2 FUN ARG VAL VAL))
(DEFUN KILL2 (FUN ARG VAL CL)
(COND ((NOT (ATOM CL)) (MAPC #'(LAMBDA (L) (KILL2 FUN ARG VAL L)) CL))
((NUMBERP CL))
(T (_ (SEL CL DATA) (KILL3 FUN ARG VAL (SEL CL DATA))))))
(DEFUN KILL3 (FUN ARG VAL DATA)
(IF (AND (EQ FUN (CAAAR DATA))
(EQ ARG (CADAAR DATA)) (EQ VAL (CADDAAR DATA)))
(CDR DATA)
(DO ((DS DATA (CDR DS)) (D)) ((NULL (CDR DS)))
(SETQ D (CAADR DS))
(IF (NOT (AND (EQ FUN (CAR D))
(EQ ARG (CADR D))
(EQ VAL (CADDR D))))
T
(_ (SEL D CON DATA) (DELQ D (SEL D CON DATA)))
(RPLACD DS (CDDR DS)) (RETURN T)))
DATA))
(DEFMFUN UNKIND (X Y)
(setq y (car (datum (LIST 'kind x y))))
(kcntxt y context)
(remf y x))
(defmfun remov (fact)
(remov4 fact (cadar fact))
(remov4 fact (caddar fact)))
(defun remov4 (fact cl)
(cond ((or (symbolp cl) ;if CL is a symbol or
(and (listp cl) ;an interned number, then we want to REMOV4 FACT
(numberp (car cl)))) ;from its property list.
(_ (sel cl data) (delq fact (sel cl data))))
((or (atom cl) (atom (car cl)))) ;if CL is an atom (not a symbol)
;or its CAR is an atom then we don't want to do
;anything to it.
(t (mapc #'(lambda (l) (remov4 fact l))
(cond ((atom (caar cl)) (cdr cl)) ;if CL's CAAR is
;an atom, then CL is an expression, and
;we want to REMOV4 FACT from the parts
;of the expression.
((atom (caaar cl)) (cdar cl)))))))
;if CL's CAAAR is an atom, then CL is a
;fact, and we want to REMOV4 FACT from
;the parts of the fact.
(DEFMFUN KILLFRAME (CL)
(MAPC #'REMOV (SEL CL DATA))
(REMPROP CL '+LABS) (REMPROP CL '-LABS)
(REMPROP CL 'OBJ) (REMPROP CL 'VAR)
(REMPROP CL 'FACT)
(REMPROP CL 'WN))
(DEFMFUN ACTIVATE N
(DO I 1 (1+ I) (> I N)
(IF (MEMQ (ARG I) CONTEXTS) NIL
(SETQ CONTEXTS (CONS (ARG I) CONTEXTS))
(CMARK (ARG I)))))
(DEFMFUN DEACTIVATE N
(DO I 1 (1+ I) (> I N)
(IF (NOT (MEMQ (ARG I) CONTEXTS)) NIL
(CUNMRK (ARG I))
(SETQ CONTEXTS (DELQ (ARG I) CONTEXTS)))))
(DEFMFUN CONTEXT N (NEWCON (LISTIFY N)))
(DEFUN NEWCON (C)
(IF (> CONINDEX CONNUMBER) (GCCON))
(SETQ C (IF (NULL C) (LIST '*GC NIL) (LIST '*GC NIL 'SUBC C)))
#-LISPM (STORE (CONUNMRK CONINDEX) C)
#-LISPM (STORE (CONMARK CONINDEX) (CDR C))
#+LISPM (SETF (AREF #'CONUNMRK CONINDEX) C)
#+LISPM (SETF (AREF #'CONMARK CONINDEX) (CDR C))
(SETQ CONINDEX (1+ CONINDEX))
C)
;; To be used with the WITH-NEW-CONTEXT macro.
(DEFUN CONTEXT-UNWINDER ()
(KILLC (CONMARK CONINDEX))
(SETQ CONINDEX (1- CONINDEX))
#-LISPM (STORE (CONUNMRK CONINDEX) ())
#+LISPM (SETF (AREF #'CONUNMRK CONINDEX) ())
)
(DEFUN GCCON ()
(GCCON1)
(WHEN (> CONINDEX CONNUMBER)
#+GC (GC)
(GCCON1)
(WHEN (> CONINDEX CONNUMBER)
(MERROR "~%Too many contexts."))))
(DEFUN GCCON1 ()
(SETQ CONINDEX 0)
(DO I 0 (1+ I) (> I CONNUMBER)
(IF (NOT (EQ (CONMARK I) (CDR (CONUNMRK I))))
(KILLC (CONMARK I))
#-LISPM (STORE (CONUNMRK CONINDEX) (CONUNMRK I))
#+LISPM (SETF (AREF #'CONUNMRK CONINDEX) (CONUNMRK I))
#-LISPM (STORE (CONMARK CONINDEX) (CONMARK I))
#+LISPM (SETF (AREF #'CONMARK CONINDEX) (CONMARK I))
(SETQ CONINDEX (1+ CONINDEX)))))
(DEFMFUN CNTXT (DAT CON)
(IF (NOT (ATOM CON)) (SETQ CON (CDR CON)))
(PUT CON (CONS DAT (GET CON 'DATA)) 'DATA)
(IF (NOT (EQ 'GLOBAL CON)) (PUT DAT CON 'CON))
DAT)
(defmfun kcntxt (fact con)
(if (not (atom con)) (setq con (cdr con)))
(put con (fdel fact (get con 'data)) 'data)
(if (not (eq 'global con)) (rem fact 'con))
fact)
(DEFUN CNTP (F)
(COND ((NOT (SETQ F (SEL F CON))))
((SETQ F (GET F 'CMARK)) (> F 0))))
(DEFMFUN CONTEXTMARK ()
(LET ((CON CONTEXT))
(UNLESS (EQ CURRENT CON)
(CUNMRK CURRENT) (SETQ CURRENT CON) (CMARK CON))))
(DEFUN CMARK (CON)
(IF (NOT (ATOM CON)) (SETQ CON (CDR CON)))
(LET ((CM (GET CON 'CMARK)))
(PUTPROP CON (IF CM (1+ CM) 1) 'CMARK)
(MAPC #'CMARK (GET CON 'SUBC))))
(DEFUN CUNMRK (CON)
(IF (NOT (ATOM CON)) (SETQ CON (CDR CON)))
(LET ((CM (GET CON 'CMARK)))
(COND (CM (PUTPROP CON (1- CM) 'CMARK)))
(MAPC #'CUNMRK (GET CON 'SUBC))))
(DEFMFUN KILLC (CON)
(CONTEXTMARK)
(COND ((NOT (NULL CON))
(MAPC #'REMOV (GET CON 'DATA))
(REMPROP CON 'DATA)
(REMPROP CON 'CMARK)
(REMPROP CON 'SUBC)))
T)
(DEFUN PROPG ()
(DO ((X) (LAB)) (NIL)
(COND ((SETQ X (DQ+))
(SETQ LAB (+LABS X))
(IF (= 0 (LOGAND (UNLAB LAB) (UNLAB (-LABZ X))))
(MARK+ X LAB) (RETURN T)))
((SETQ X (DQ-))
(SETQ LAB (-LABS X))
(IF (= 0 (LOGAND (UNLAB LAB) (UNLAB (+LABZ X))))
(MARK- X LAB) (RETURN T)))
(T (RETURN NIL)))))
(DEFUN MARK+ (CL LAB)
(COND (DBTRACE (SETQ MARKS (1+ MARKS))
(MTELL "~%Marking ~A +" CL) (PRLAB LAB)))
(MAPC #'(LAMBDA (L) (MARK+0 CL LAB L)) (SEL CL DATA)))
(DEFUN MARK+0 (CL LAB FACT)
(COND (DBCHECK (MTELL "~%Checking ~A from ~A+" (CAR FACT) CL) (PRLAB LAB)))
(COND ((ONPU LAB FACT))
((NOT (CNTP FACT)))
((NULL (SEL FACT WN)) (MARK+1 CL LAB FACT))
((ONP (SEL FACT WN) WORLD) (MARK+1 CL LAB FACT))
((OFFP (SEL FACT WN) WORLD) NIL)
(T (MARK+3 CL LAB FACT))))
(DEFUN MARK+1 (CL LAB DAT)
(COND ((EQ (CAAR DAT) 'KIND)
(IF (EQ (CADAR DAT) CL) (MID (CADDAR DAT) LAB))) ; E1
((EQ (CAAR DAT) 'PAR)
(IF (NOT (EQ (CADDAR DAT) CL))
(PROGN (CANCEL LAB DAT) ; PR1
(MID (CADDAR DAT) LAB)
(DO L (CADAR DAT) (CDR L) (NULL L)
(IF (NOT (EQ (CAR L) CL)) (MID- (CAR L) LAB))))))
((EQ (CADAR DAT) CL)
(IF (+LABS (CAAR DAT)) ; V1
(END (CADDAR DAT) (DBV LAB (+LABS (CAAR DAT)))))
(IF (-LABS (CADDAR DAT)) ; F4
(END- (CAAR DAT) (LPR LAB (-LABS (CADDAR DAT))))))))
(DEFUN MARK+3 (CL LAB DAT) CL LAB ;Ignored
(IFN (= 0 (LOGAND (UNLAB (+LABZ (CADDAR DAT)))
(UNLAB (DBV (+LABZ (CADAR DAT)) (-LABZ (CAAR DAT))))))
(BEG- (SEL DAT WN) WORLD)))
(DEFUN MARK- (CL LAB)
(WHEN DBTRACE
(SETQ MARKS (1+ MARKS)) (MTELL "Marking ~A -" CL) (PRLAB LAB))
(MAPC #'(LAMBDA (L) (MARK-0 CL LAB L)) (SEL CL DATA)))
(DEFUN MARK-0 (CL LAB FACT)
(WHEN DBCHECK (MTELL "~%Checking ~A from ~A-" (CAR FACT) CL) (PRLAB LAB))
(COND ((ONPU LAB FACT))
((NOT (CNTP FACT)))
((NULL (SEL FACT WN)) (MARK-1 CL LAB FACT))
((ONP (SEL FACT WN) WORLD) (MARK-1 CL LAB FACT))
((OFFP (SEL FACT WN) WORLD) NIL)))
(DEFUN MARK-1 (CL LAB DAT)
(COND ((EQ (CAAR DAT) 'KIND)
(IF (NOT (EQ (CADAR DAT) CL)) (MID- (CADAR DAT) LAB))) ; E4
((EQ (CAAR DAT) 'PAR)
(IF (EQ (CADDAR DAT) CL)
(PROG2 (CANCEL LAB DAT) ; S4
(DO L (CADAR DAT) (CDR L) (NULL L) (MID- (CAR L) LAB)))
(PROGN (SETQ-UNLAB LAB) ; ALL4
(DO L (CADAR DAT) (CDR L) (NULL L)
(SETQ LAB (LOGAND (UNLAB (-LABZ (CAR L))) LAB)))
(SETQ-COPYN LAB)
(CANCEL LAB DAT)
(MID- (CADDAR DAT) LAB))))
((EQ (CADDAR DAT) CL)
(IF (+LABS (CAAR DAT)) ; A2
(END- (CADAR DAT) (DBA (+LABS (CAAR DAT)) LAB)))
(IF (+LABS (CADAR DAT)) ; F6
(END- (CAAR DAT) (LPR (+LABS (CADAR DAT)) LAB))))))
; in out in out ins in out
; ----------- ------------- ----------------
; E1 | + INV1 | + AB1 |(+) + +
; E2 | - INV2 | - AB2 |(+) - +
; E3 | + INV3 | + AB3 |(+) + -
; E4 | - INV4 | - AB4 |(+) - -
; AB5 |(-) + +
; in out in out AB6 |(-) - +
; ----------- ------------- AB7 |(-) + -
; S1 | (+) ALL1 |(+) + AB8 |(-) - -
; S2 | (-) ALL2 |(+) -
; S3 |(+) ALL3 |(-) +
; S4 |(-) ALL4 |(-) -
; in rel out in rel out in rel out
; --------------- --------------- ---------------
; V1 | (+) + A1 | + (+) F1 | + (+)
; V2 | (+) - A2 | - (+) F2 | + (-)
; V3 | (-) + A3 | + (-) F3 | - (+)
; V4 | (-) - A4 | - (-) F4 | - (-)
; F5 |(+) +
; F6 |(+) -
; F7 |(-) +
; F8 |(-) -
(DEFUN UNI (P1 P2 AL)
(COND ((DBVARP P1) (DBUNIVAR P1 P2 AL))
((NODEP P1)
(COND ((DBVARP P2) (DBUNIVAR P2 P1 AL))
((NODEP P2) (IF (EQ P1 P2) AL))))
((DBVARP P2) (DBUNIVAR P2 P1 AL))
((NODEP P2) NIL)
((SETQ AL (UNI (CAR P1) (CAR P2) AL)) (UNI (CDR P1) (CDR P2) AL))))
(DEFUN DBUNIVAR (P V AL)
(LET ((DUM (ASSQ P AL)))
(COND ((NULL DUM) (CONS (CONS P V) AL))
(T (UNI (CDR DUM) V AL)))))
; Undeclarations for the file:
(DECLARE (NOTYPE LAB))