mirror of
https://github.com/PDP-10/its.git
synced 2026-03-06 19:31:20 +00:00
Also updates a bunch of Macsyma sources to latest versions, which was needed to get declare working with consistent sources. Resolves #960.
427 lines
13 KiB
Common Lisp
427 lines
13 KiB
Common Lisp
;;;;;;;;;;;;;;;;;;; -*- Mode: Lisp; Package: Macsyma -*- ;;;;;;;;;;;;;;;;;;;
|
||
;;; (c) Copyright 1976, 1983 Massachusetts Institute of Technology ;;;
|
||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||
|
||
(macsyma-module grind)
|
||
|
||
(DECLARE (GENPREFIX GRI)
|
||
(SPECIAL LOP ROP STRING CHRPS $ALIASES ALIASLIST LINEL)
|
||
(FIXNUM (CHRCT*))
|
||
(*EXPR LBP RBP))
|
||
|
||
(DEFUN CHRCT* () (- LINEL CHRPS))
|
||
|
||
(DEFVAR ALPHABET '(#/% #/_))
|
||
(DEFVAR FORTRANP NIL)
|
||
|
||
(DEFMSPEC $GRIND (X) (SETQ X (CDR X))
|
||
(LET (Y)
|
||
(IF (NOT (ZEROP (CHARPOS T))) (MTERPRI))
|
||
(COND ((OR (NULL X) (CDR X)) (WNA-ERR '$GRIND))
|
||
((SYMBOLP (SETQ X (STRMEVAL (CAR X))))
|
||
(SETQ X ($VERBIFY X))
|
||
(COND ((SETQ Y (MGET X 'MEXPR))
|
||
(MGRIND (LIST '(MDEFINE) (CONS (LIST X) (CDADR Y)) (CADDR Y)) NIL))
|
||
((SETQ Y (MGET X 'MMACRO))
|
||
(MGRIND (LIST '(MDEFMACRO) (CONS (LIST X) (CDADR Y)) (CADDR Y)) NIL))
|
||
((SETQ Y (MGET X 'AEXPR))
|
||
(MGRIND (LIST '(MDEFINE) (CONS (LIST X 'ARRAY) (CDADR Y)) (CADDR Y)) NIL))
|
||
(T (MGRIND X NIL)))
|
||
(TYO #/$ NIL))
|
||
(T (MGRIND X NIL) (TYO #/$ NIL)))
|
||
'$DONE))
|
||
|
||
(DEFUN MGRIND (X OUT)
|
||
(SETQ CHRPS 0)
|
||
(MPRINT (MSIZE X NIL NIL 'MPAREN 'MPAREN) OUT))
|
||
|
||
(DEFUN MPRINT (X OUT)
|
||
(COND ((FIXP X) (SETQ CHRPS (1+ CHRPS)) (TYO X OUT))
|
||
((< (CAR X) (CHRCT*)) (MAPC #'(LAMBDA (L) (MPRINT L OUT)) (CDR X)))
|
||
(T (PROG (I) (SETQ I CHRPS)
|
||
(MPRINT (CADR X) OUT)
|
||
(COND ((NULL (CDDR X)) (RETURN NIL))
|
||
((AND (OR (ATOM (CADR X)) (< (CAADR X) (CHRCT*)))
|
||
(OR (> (CHRCT*) (// LINEL 2))
|
||
(ATOM (CADDR X)) (< (CAADDR X) (CHRCT*))))
|
||
(SETQ I CHRPS)
|
||
(MPRINT (CADDR X) OUT))
|
||
(T (SETQ I (1+ I)) (SETQ CHRPS 0) (TERPRI OUT)
|
||
(MTYOTBSP I OUT) (MPRINT (CADDR X) OUT)))
|
||
(DO L (CDDDR X) (CDR L) (NULL L)
|
||
(IF (OR (ATOM (CAR L)) (< (CAAR L) (CHRCT*))) NIL
|
||
(SETQ CHRPS 0) (TERPRI OUT) (MTYOTBSP I OUT))
|
||
(MPRINT (CAR L) OUT))))))
|
||
|
||
(DEFUN MTYOTBSP (N OUT) (DECLARE (FIXNUM N))
|
||
(SETQ CHRPS (+ N CHRPS))
|
||
(DO () ((< N 8)) (TYO #\TAB OUT) (SETQ N (- N 8)))
|
||
(DO () ((< N 1)) (TYO #\SP OUT) (SETQ N (1- N))))
|
||
|
||
(DEFUN STRGRIND (X)
|
||
(LET (STRING (CHRPS 0))
|
||
(STRPRINT (MSIZE X NIL NIL 'MPAREN 'MPAREN))
|
||
(NREVERSE STRING)))
|
||
|
||
(DEFUN STRPRINT (X)
|
||
(COND ((ATOM X) (STYO X))
|
||
((< (CAR X) (CHRCT*)) (MAPC #'STRPRINT (CDR X)))
|
||
(T (PROG (I)
|
||
(SETQ I CHRPS)
|
||
(STRPRINT (CADR X))
|
||
(COND ((NULL (CDDR X)) (RETURN NIL))
|
||
((AND (OR (ATOM (CADR X)) (< (CAADR X) (CHRCT*)))
|
||
(OR (> (CHRCT*) (// LINEL 2))
|
||
(ATOM (CADDR X)) (< (CAADDR X) (CHRCT*))))
|
||
(SETQ I CHRPS)
|
||
(STRPRINT (CADDR X)))
|
||
(T (SETQ I (1+ I)) (SETQ CHRPS 0) (STERPRI)
|
||
(STYOTBSP I) (STRPRINT (CADDR X))))
|
||
(DO L (CDDDR X) (CDR L) (NULL L)
|
||
(IF (OR (ATOM (CAR L)) (< (CAAR L) (CHRCT*))) NIL
|
||
(SETQ CHRPS 0) (STERPRI) (STYOTBSP I))
|
||
(STRPRINT (CAR L)))))))
|
||
|
||
(DEFUN STYO (X) (SETQ STRING (CONS X STRING) CHRPS (1+ CHRPS)))
|
||
|
||
(DEFUN STERPRI () (SETQ STRING (CONS #\NEWLINE STRING) CHRPS 0))
|
||
|
||
(DEFUN STYOTBSP (N) (DECLARE (FIXNUM N)) (SETQ CHRPS N)
|
||
(DO () ((< N 8)) (SETQ STRING (CONS #\TAB STRING) N (- N 8)))
|
||
(DO () ((< N 1)) (SETQ STRING (CONS #\SP STRING) N (1- N))))
|
||
|
||
(DEFMFUN MSTRING (X)
|
||
(NREVERSE (STRING1 (MSIZE X NIL NIL 'MPAREN 'MPAREN) NIL)))
|
||
|
||
(DEFUN STRING1 (X L)
|
||
(IF (ATOM X) (CONS X L)
|
||
(SETQ X (CDR X))
|
||
(DO () ((NULL X) L) (SETQ L (STRING1 (CAR X) L) X (CDR X)))))
|
||
|
||
(DEFUN MSIZE (X L R LOP ROP)
|
||
(SETQ X (NFORMAT X))
|
||
(COND ((ATOM X) (IF FORTRANP (MSZ (MAKESTRING X) L R) (MSIZE-ATOM X L R)))
|
||
((OR (<= (LBP (CAAR X)) (RBP LOP)) (> (LBP ROP) (RBP (CAAR X))))
|
||
(MSIZE-PAREN X L R))
|
||
((MEMQ 'ARRAY (CDAR X)) (MSIZE-ARRAY X L R))
|
||
((GET (CAAR X) 'GRIND) (FUNCALL (GET (CAAR X) 'GRIND) X L R))
|
||
(T (MSIZE-FUNCTION X L R NIL))))
|
||
|
||
(DEFUN MSIZE-ATOM (X L R)
|
||
(PROG (Y)
|
||
(COND ((NUMBERP X) (SETQ Y (EXPLODEN X)))
|
||
((AND (SETQ Y (GET X 'REVERSEALIAS))
|
||
(NOT (AND (MEMQ X $ALIASES) (GET X 'NOUN))))
|
||
(SETQ Y (EXPLODEN Y)))
|
||
((SETQ Y (ASSQR X ALIASLIST)) (RETURN (MSIZE (CAR Y) L R LOP ROP)))
|
||
((NULL (SETQ Y (IF (EQ '%DERIVATIVE X)
|
||
(COPY-TOP-LEVEL '(#/% #/D #/I #/F #/F))
|
||
(EXPLODEN X)))))
|
||
((= #/$ (CAR Y)) (SETQ Y (SLASH (CDR Y))))
|
||
((= #/% (CAR Y)) (SETQ Y (SLASH (CDR Y))))
|
||
((= #/& (CAR Y))
|
||
(DO L (CDR Y) (CDR L) (NULL L)
|
||
(COND ((OR (MEMBER (CAR L) '(#/" #/\ #/; #/$))
|
||
(AND (< (CAR L) 32.) (NOT (= (CAR L) 13.))))
|
||
(RPLACD L (CONS (CAR L) (CDR L)))
|
||
(RPLACA L #/\) (SETQ L (CDR L)))))
|
||
(SETQ Y (CONS #/" (NCONC (CDR Y) (LIST #/")))))
|
||
(T (SETQ Y (CONS #/? (SLASH Y)))))
|
||
(RETURN (MSZ Y L R))))
|
||
|
||
(DEFUN MSZ (X L R) (SETQ X (NRECONC L (NCONC X R))) (CONS (LENGTH X) X))
|
||
|
||
(DEFUN SLASH (X)
|
||
(DO L (CDR X) (CDR L) (NULL L)
|
||
(IF (ALPHANUMP (CAR L)) NIL
|
||
(RPLACD L (CONS (CAR L) (CDR L)))
|
||
(RPLACA L #/\) (SETQ L (CDR L))))
|
||
(IF (ALPHABETP (CAR X)) X (CONS #/\ X)))
|
||
|
||
(DEFUN ALPHANUMP (N) (DECLARE (FIXNUM N))
|
||
(OR (ASCII-NUMBERP N) (ALPHABETP N)))
|
||
|
||
(DEFUN MSIZE-PAREN (X L R) (MSIZE X (CONS #/( L) (CONS #/) R) 'MPAREN 'MPAREN))
|
||
|
||
;; The variables LB and RB are not uses here syntactically, but for
|
||
;; communication. The FORTRAN program rebinds them to #/( and #/) since
|
||
;; Fortran array references are printed with parens instead of brackets.
|
||
|
||
(DEFVAR LB #/[)
|
||
(DEFVAR RB #/])
|
||
|
||
(DEFUN MSIZE-ARRAY (X L R &AUX F)
|
||
(IF (EQ 'MQAPPLY (CAAR X)) (SETQ F (CADR X) X (CDR X)) (SETQ F (CAAR X)))
|
||
(COND ((AND (GET (CAAR X) 'VERB) (GET (CAAR X) 'ALIAS))
|
||
(SETQ L (RECONC '(#/' #/') L)))
|
||
((AND (GET (CAAR X) 'NOUN) (NOT (MEMQ (CAAR X) (CDR $ALIASES)))
|
||
(NOT (GET (CAAR X) 'REVERSEALIAS)))
|
||
(SETQ L (CONS #/' L))))
|
||
(SETQ L (MSIZE F L (LIST LB) LOP 'MFUNCTION)
|
||
R (MSIZE-LIST (CDR X) NIL (CONS RB R)))
|
||
(CONS (+ (CAR L) (CAR R)) (CONS L (CDR R))))
|
||
|
||
(DEFUN MSIZE-FUNCTION (X L R OP)
|
||
(COND ((AND (GET (CAAR X) 'VERB) (GET (CAAR X) 'ALIAS))
|
||
(SETQ L (RECONC '(#/' #/') L)))
|
||
((AND (GET (CAAR X) 'NOUN) (NOT (MEMQ (CAAR X) (CDR $ALIASES)))
|
||
(NOT (GET (CAAR X) 'REVERSEALIAS)))
|
||
(SETQ L (CONS #/' L))))
|
||
(SETQ L (MSIZE (IF OP (GETOP (CAAR X)) (CAAR X)) L (NCONS #/( ) 'MPAREN 'MPAREN)
|
||
R (MSIZE-LIST (CDR X) NIL (CONS #/) R)))
|
||
(CONS (+ (CAR L) (CAR R)) (CONS L (CDR R))))
|
||
|
||
(DEFUN MSIZE-LIST (X L R)
|
||
(DECLARE (FIXNUM W))
|
||
(IF (NULL X) (MSZ NIL L R)
|
||
(DO ((NL) (W 0))
|
||
((NULL (CDR X))
|
||
(SETQ NL (CONS (MSIZE (CAR X) L R 'MPAREN 'MPAREN) NL))
|
||
(CONS (+ W (CAAR NL)) (NREVERSE NL)))
|
||
(SETQ NL (CONS (MSIZE (CAR X) L (LIST #/,) 'MPAREN 'MPAREN) NL)
|
||
W (+ W (CAAR NL)) X (CDR X) L NIL))))
|
||
|
||
(DEFUN MSIZE-PREFIX (X L R)
|
||
(MSIZE (CADR X) (RECONC (STRSYM (CAAR X)) L) R (CAAR X) ROP))
|
||
|
||
(DEFUN MSIZE-INFIX (X L R)
|
||
(IF (OR (NULL (CDDR X)) (CDDDR X)) (WNA-ERR (CAAR X)))
|
||
(SETQ L (MSIZE (CADR X) L NIL LOP (CAAR X))
|
||
R (MSIZE (CADDR X) (REVERSE (STRSYM (CAAR X))) R (CAAR X) ROP))
|
||
(LIST (+ (CAR L) (CAR R)) L R))
|
||
|
||
(DEFUN MSIZE-POSTFIX (X L R)
|
||
(MSIZE (CADR X) L (APPEND (STRSYM (CAAR X)) R) LOP (CAAR X)))
|
||
|
||
(DEFUN MSIZE-NARY (X L R) (MSZNARY X L R (STRSYM (CAAR X))))
|
||
|
||
(DEFUN MSIZE-NOFIX (X L R) (MSIZE (CAAR X) L R (CAAR X) ROP))
|
||
|
||
(DEFUN MSIZE-MATCHFIX (X L R)
|
||
(SETQ L (NRECONC L (CAR (STRSYM (CAAR X))))
|
||
L (CONS (LENGTH L) L)
|
||
R (APPEND (CDR (STRSYM (CAAR X))) R)
|
||
X (MSIZE-LIST (CDR X) NIL R))
|
||
(CONS (+ (CAR L) (CAR X)) (CONS L (CDR X))))
|
||
|
||
(DEFUN MSZNARY (X L R DISSYM)
|
||
(DECLARE (FIXNUM W))
|
||
(COND ((NULL (CDDR X)) (MSIZE-FUNCTION X L R T))
|
||
(T (SETQ L (MSIZE (CADR X) L NIL LOP (CAAR X)))
|
||
(DO ((OL (CDDR X) (CDR OL)) (NL (LIST L)) (W (CAR L)))
|
||
((NULL (CDR OL))
|
||
(SETQ R (MSIZE (CAR OL) (REVERSE DISSYM) R (CAAR X) ROP))
|
||
(CONS (+ (CAR R) W) (NREVERSE (CONS R NL))))
|
||
(SETQ NL (CONS (MSIZE (CAR OL) (REVERSE DISSYM) NIL (CAAR X) (CAAR X))
|
||
NL)
|
||
W (+ (CAAR NL) W))))))
|
||
|
||
(DEFUN STRSYM (X) (OR (GET X 'STRSYM) (GET X 'DISSYM)))
|
||
|
||
(DEFPROP BIGFLOAT MSZ-BIGFLOAT GRIND)
|
||
|
||
(DEFUN MSZ-BIGFLOAT (X L R)
|
||
(MSZ (MAPCAR '(LAMBDA (L) (GETCHARN L 1)) (FPFORMAT X)) L R))
|
||
|
||
(DEFPROP MPROGN MSIZE-MATCHFIX GRIND)
|
||
(DEFPROP MLIST MSIZE-MATCHFIX GRIND)
|
||
|
||
(DEFPROP MQAPPLY MSZ-MQAPPLY GRIND)
|
||
|
||
(DEFUN MSZ-MQAPPLY (X L R)
|
||
(SETQ L (MSIZE (CADR X) L (LIST #/( ) LOP 'MFUNCTION)
|
||
R (MSIZE-LIST (CDDR X) NIL (CONS #/) R)))
|
||
(CONS (+ (CAR L) (CAR R)) (CONS L (CDR R))))
|
||
|
||
|
||
(DEFPROP MQUOTE MSIZE-PREFIX GRIND)
|
||
(DEFPROP MQUOTE 201. RBP)
|
||
|
||
(DEFPROP MSETQ MSIZE-INFIX GRIND)
|
||
(DEFPROP MSETQ (#/:) STRSYM)
|
||
(DEFPROP MSETQ 180. RBP)
|
||
(DEFPROP MSETQ 20. RBP)
|
||
|
||
(DEFPROP MSET MSIZE-INFIX GRIND)
|
||
(DEFPROP MSET (#/: #/:) STRSYM)
|
||
(DEFPROP MSET 180. LBP)
|
||
(DEFPROP MSET 20. RBP)
|
||
|
||
(DEFPROP MDEFINE MSZ-MDEF GRIND)
|
||
(DEFPROP MDEFINE (#/: #/=) STRSYM)
|
||
(DEFPROP MDEFINE 180. LBP)
|
||
(DEFPROP MDEFINE 20. RBP)
|
||
|
||
(DEFPROP MDEFMACRO MSZ-MDEF GRIND)
|
||
(DEFPROP MDEFMACRO (#/: #/: #/=) STRSYM)
|
||
(DEFPROP MDEFMACRO 180. LBP)
|
||
(DEFPROP MDEFMACRO 20. RBP)
|
||
|
||
(DEFUN MSZ-MDEF (X L R)
|
||
(SETQ L (MSIZE (CADR X) L (COPY-TOP-LEVEL (STRSYM (CAAR X))) LOP (CAAR X))
|
||
R (MSIZE (CADDR X) NIL R (CAAR X) ROP))
|
||
(SETQ X (CONS (- (CAR L) (CAADR L)) (CDDR L)))
|
||
(IF (AND (NOT (ATOM (CADR R))) (NOT (ATOM (CADDR R)))
|
||
(< (+ (CAR L) (CAADR R) (CAADDR R)) LINEL))
|
||
(SETQ X (NCONC X (LIST (CADR R) (CADDR R)))
|
||
R (CONS (CAR R) (CDDDR R))))
|
||
(CONS (+ (CAR L) (CAR R)) (CONS (CADR L) (CONS X (CDR R)))))
|
||
|
||
|
||
(DEFPROP MFACTORIAL MSIZE-POSTFIX GRIND)
|
||
(DEFPROP MFACTORIAL 160. LBP)
|
||
|
||
(DEFPROP MEXPT MSZ-MEXPT GRIND)
|
||
(DEFPROP MEXPT 140. LBP)
|
||
(DEFPROP MEXPT 139. RBP)
|
||
|
||
(DEFUN MSZ-MEXPT (X L R)
|
||
(SETQ L (MSIZE (CADR X) L NIL LOP 'MEXPT)
|
||
R (IF (MMMINUSP (SETQ X (NFORMAT (CADDR X))))
|
||
(MSIZE (CADR X) (REVERSE '(#/^ #/-)) R 'MEXPT ROP)
|
||
(MSIZE X (LIST #/^) R 'MEXPT ROP)))
|
||
(LIST (+ (CAR L) (CAR R)) L R))
|
||
|
||
|
||
(DEFPROP MNCEXPT MSIZE-INFIX GRIND)
|
||
(DEFPROP MNCEXPT 135. LBP)
|
||
(DEFPROP MNCEXPT 134. RBP)
|
||
|
||
(DEFPROP MNCTIMES MSIZE-NARY GRIND)
|
||
(DEFPROP MNCTIMES 110. LBP)
|
||
(DEFPROP MNCTIMES 109. RBP)
|
||
|
||
(DEFPROP MTIMES MSZ-MTIMES GRIND)
|
||
(DEFPROP MTIMES 120. LBP)
|
||
(DEFPROP MTIMES 120. RBP)
|
||
|
||
(DEFUN MSZ-MTIMES (X L R) (MSZNARY X L R '(#/*)))
|
||
|
||
|
||
(DEFPROP MQUOTIENT MSIZE-INFIX GRIND)
|
||
(DEFPROP MQUOTIENT 120. LBP)
|
||
(DEFPROP MQUOTIENT 121. RBP)
|
||
(DEFPROP RAT MSIZE-INFIX GRIND)
|
||
(DEFPROP RAT 120. LBP)
|
||
(DEFPROP RAT 121. RBP)
|
||
|
||
(DEFPROP MPLUS MSZ-MPLUS GRIND)
|
||
(DEFPROP MPLUS 100. LBP)
|
||
(DEFPROP MPLUS 100. RBP)
|
||
|
||
(DEFUN MSZ-MPLUS (X L R)
|
||
(DECLARE (FIXNUM W))
|
||
(COND ((NULL (CDDR X))
|
||
(IF (NULL (CDR X))
|
||
(MSIZE-FUNCTION X L R T)
|
||
(MSIZE (CADR X) (APPEND (NCONS #/+) L) R 'MPLUS ROP)))
|
||
(T (SETQ L (MSIZE (CADR X) L NIL LOP 'MPLUS) X (CDDR X))
|
||
(DO ((NL (LIST L)) (W (CAR L)) (DISSYM))
|
||
((NULL (CDR X))
|
||
(IF (MMMINUSP (CAR X)) (SETQ L (CADAR X) DISSYM (LIST #/-))
|
||
(SETQ L (CAR X) DISSYM (LIST #/+)))
|
||
(SETQ R (MSIZE L DISSYM R 'MPLUS ROP))
|
||
(CONS (+ (CAR R) W) (NREVERSE (CONS R NL))))
|
||
(IF (MMMINUSP (CAR X)) (SETQ L (CADAR X) DISSYM (LIST #/-))
|
||
(SETQ L (CAR X) DISSYM (LIST #/+)))
|
||
(SETQ NL (CONS (MSIZE L DISSYM NIL 'MPLUS 'MPLUS) NL)
|
||
W (+ (CAAR NL) W)
|
||
X (CDR X))))))
|
||
|
||
(DEFPROP MMINUS MSIZE-PREFIX GRIND)
|
||
(DEFPROP MMINUS (#/-) STRSYM)
|
||
(DEFPROP MMINUS 100. RBP)
|
||
(DEFPROP MMINUS 100. LBP)
|
||
|
||
(DEFPROP MEQUAL MSIZE-INFIX GRIND)
|
||
(DEFPROP MEQUAL 80. LBP)
|
||
(DEFPROP MEQUAL 80. RBP)
|
||
|
||
(DEFPROP MNOTEQUAL MSIZE-INFIX GRIND)
|
||
(DEFPROP MNOTEQUAL 80. LBP)
|
||
(DEFPROP MNOTEQUAL 80. RBP)
|
||
|
||
(DEFPROP MGREATERP MSIZE-INFIX GRIND)
|
||
(DEFPROP MGREATERP 80. LBP)
|
||
(DEFPROP MGREATERP 80. RBP)
|
||
|
||
(DEFPROP MGEQP MSIZE-INFIX GRIND)
|
||
(DEFPROP MGEQP 80. LBP)
|
||
(DEFPROP MGEQP 80. RBP)
|
||
|
||
(DEFPROP MLESSP MSIZE-INFIX GRIND)
|
||
(DEFPROP MLESSP 80. LBP)
|
||
(DEFPROP MLESSP 80. RBP)
|
||
|
||
(DEFPROP MLEQP MSIZE-INFIX GRIND)
|
||
(DEFPROP MLEQP 80. LBP)
|
||
(DEFPROP MLEQP 80. RBP)
|
||
|
||
(DEFPROP MNOT MSIZE-PREFIX GRIND)
|
||
(DEFPROP MNOT 70. RBP)
|
||
|
||
(DEFPROP MAND MSIZE-NARY GRIND)
|
||
(DEFPROP MAND 60. LBP)
|
||
(DEFPROP MAND 60. RBP)
|
||
|
||
(DEFPROP MOR MSIZE-NARY GRIND)
|
||
(DEFPROP MOR 50. LBP)
|
||
(DEFPROP MOR 50. RBP)
|
||
|
||
(DEFPROP MCOND MSZ-MCOND GRIND)
|
||
(DEFPROP MCOND 25. LBP)
|
||
(DEFPROP MCOND 25. RBP)
|
||
|
||
(DEFUN MSZ-MCOND (X L R &AUX IF)
|
||
(SETQ IF (NRECONC L '(#/I #/F #\SP)) IF (CONS (LENGTH IF) IF)
|
||
L (MSIZE (CADR X) NIL NIL 'MCOND 'MPAREN))
|
||
(COND ((EQ '$FALSE (FIFTH X))
|
||
(SETQ X (MSIZE (CADDR X)
|
||
(REVERSE '(#\SP #/T #/H #/E #/N #\SP))
|
||
R 'MCOND ROP))
|
||
(LIST (+ (CAR IF) (CAR L) (CAR X)) IF L X))
|
||
(T (SETQ R (MSIZE (FIFTH X)
|
||
(REVERSE '(#\SP #/E #/L #/S #/E #\SP))
|
||
R 'MCOND ROP)
|
||
X (MSIZE (CADDR X)
|
||
(REVERSE '(#\SP #/T #/H #/E #/N #\SP))
|
||
NIL 'MCOND 'MPAREN))
|
||
(LIST (+ (CAR IF) (CAR L) (CAR X) (CAR R)) IF L X R))))
|
||
|
||
|
||
(DEFPROP MDO MSZ-MDO GRIND)
|
||
(DEFPROP MDO 30. LBP)
|
||
(DEFPROP MDO 30. RBP)
|
||
(DEFPROP MDOIN MSZ-MDOIN GRIND)
|
||
(DEFPROP MDOIN 30. RBP)
|
||
|
||
(DEFUN MSZ-MDO (X L R)
|
||
(MSZNARY (CONS '(MDO) (STRMDO X)) L R '(#\SP)))
|
||
|
||
(DEFUN MSZ-MDOIN (X L R)
|
||
(MSZNARY (CONS '(MDO) (STRMDOIN X)) L R '(#\SP)))
|
||
|
||
(DEFUN STRMDO (X)
|
||
(NCONC (COND ((SECOND X) `($FOR ,(SECOND X))))
|
||
(COND ((EQUAL 1 (THIRD X)) NIL)
|
||
((THIRD X) `($FROM ,(THIRD X))))
|
||
(COND ((EQUAL 1 (FOURTH X)) NIL)
|
||
((FOURTH X) `($STEP ,(FOURTH X)))
|
||
((FIFTH X) `($NEXT ,(FIFTH X))))
|
||
(COND ((SIXTH X) `($THRU ,(SIXTH X))))
|
||
(COND ((NULL (SEVENTH X)) NIL)
|
||
((EQ 'MNOT (CAAR (SEVENTH X)))
|
||
`($WHILE ,(CADR (SEVENTH X))))
|
||
(T `($UNLESS ,(SEVENTH X))))
|
||
`($DO ,(EIGHTH X))))
|
||
|
||
(DEFUN STRMDOIN (X)
|
||
(NCONC `($FOR ,(SECOND X) $IN ,(THIRD X))
|
||
(COND ((SIXTH X) `($THRU ,(SIXTH X))))
|
||
(COND ((NULL (SEVENTH X)) NIL)
|
||
((EQ 'MNOT (CAAR (SEVENTH X)))
|
||
`($WHILE ,(CADR (SEVENTH X))))
|
||
(T `($UNLESS ,(SEVENTH X))))
|
||
`($DO ,(EIGHTH X))))
|
||
|
||
|