1
0
mirror of https://github.com/PDP-10/its.git synced 2026-02-15 12:26:27 +00:00

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.
This commit is contained in:
Eric Swenson
2018-07-07 10:54:09 -07:00
parent bb894e4e55
commit bf8f96b837
14 changed files with 9827 additions and 6 deletions

1320
src/mrg/compar.864 Normal file

File diff suppressed because it is too large Load Diff

710
src/mrg/db.1149 Normal file
View File

@@ -0,0 +1,710 @@
;;;;;;;;;;;;;;;;;;; -*- 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))

1589
src/mrg/displa.780 Normal file

File diff suppressed because it is too large Load Diff

158
src/mrg/fortra.66 Normal file
View File

@@ -0,0 +1,158 @@
;;;;;;;;;;;;;;;;;;; -*- Mode: Lisp; Package: Macsyma -*- ;;;;;;;;;;;;;;;;;;;
;;; (c) Copyright 1976, 1983 Massachusetts Institute of Technology ;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(macsyma-module fortra)
(DECLARE (SPECIAL LB RB ;Used for communication with MSTRING.
$LOADPRINT ;If NIL, no load message gets printed.
1//2 -1//2)
(*LEXPR FORTRAN-PRINT $FORTMX))
(DEFMVAR $FORTSPACES NIL
"If T, Fortran card images are filled out to 80 columns using spaces."
BOOLEAN
MODIFIED-COMMANDS '$FORTRAN)
(DEFMVAR $FORTINDENT 0
"The number of spaces (beyond 6) to indent Fortran statements as they
are printed."
FIXNUM
MODIFIED-COMMANDS '$FORTRAN)
;;; Output the EXP to the editor buffer Macsyma-Generated-Fortran.
#+LispM
(DEFMSPEC $FORTRAN_TO_EDITOR (EXP)
(ZWEI:WITH-EDITOR-STREAM (STANDARD-OUTPUT ':BUFFER-NAME "Macsyma-Generated-Fortran")
(FUNCALL (GET '$FORTRAN 'MFEXPR*) EXP)))
;; This function is called from Macsyma toplevel. If the argument is a
;; symbol, and the symbol is bound to a matrix, then the matrix is printed
;; using an array assignment notation.
(DEFMSPEC $FORTRAN (L)
(SETQ L (FEXPRCHECK L))
(LET ((VALUE (STRMEVAL L)))
(COND ((MSETQP L) (SETQ VALUE `((MEQUAL) ,(CADR L) ,(MEVAL L)))))
(COND ((AND (SYMBOLP L) ($MATRIXP VALUE))
($FORTMX L VALUE))
((AND (NOT (ATOM VALUE)) (EQ (CAAR VALUE) 'MEQUAL)
(SYMBOLP (CADR VALUE)) ($MATRIXP (CADDR VALUE)))
($FORTMX (CADR VALUE) (CADDR VALUE)))
(T (FORTRAN-PRINT VALUE)))))
;; This function is called from Lisp programs. It takes an expression and
;; a stream argument. Default stream is NIL in MacLisp and STANDARD-OUTPUT
;; in LMLisp. This should be canonicalized in Macsyma at some point.
;; TERPRI is a PDP10 MacLisp flag which, if set to T, will keep symbols and
;; bignums from being broken across page boundaries when printed. $LOADPRINT
;; is NIL to keep a message from being printed when the file containing MSTRING
;; is loaded. (MRG;GRIND)
(DEFPROP MEXPT (#/* #/*) DISSYM)
(DEFUN FORTRAN-PRINT (X &OPTIONAL (STREAM #-LISPM NIL #+LISPM STANDARD-OUTPUT)
&AUX #+PDP10 (TERPRI T) #+PDP10 ($LOADPRINT NIL)
;; This is a poor way of saying that array references
;; are to be printed with parens instead of brackets.
(LB #/( ) (RB #/) ))
;; Restructure the expression for displaying.
(SETQ X (FORTSCAN X))
;; Linearize the expression using MSTRING. Some global state must be
;; modified for MSTRING to generate using Fortran syntax. This must be
;; undone so as not to modify the toplevel behavior of MSTRING.
(UNWIND-PROTECT
(PROGN
(DEFPROP MEXPT MSIZE-INFIX GRIND)
(DEFPROP MMINUS 100. LBP)
(DEFPROP MSETQ (#/=) STRSYM)
(SETQ X (MSTRING X)))
;; Make sure this gets done before exiting this frame.
(DEFPROP MEXPT MSZ-MEXPT GRIND)
(REMPROP 'MMINUS 'LBP)
(DEFPROP MSETQ (#/:) STRSYM))
;; MSTRING returns a list of characters. Now print them.
(DO ((C #/0 (+ 1 (\ (- c #/0) 16) #/0))
(COLUMN (+ 6 $FORTINDENT) (+ 9 $FORTINDENT)))
((NULL X))
;; Print five spaces, a continuation character if needed, and then
;; more spaces. COLUMN points to the last column printed in. When
;; it equals 80, we should quit.
(COND ((= C #/0)
(PRINT-SPACES COLUMN STREAM))
(T (PRINT-SPACES 5 STREAM)
(TYO C STREAM)
(PRINT-SPACES (- COLUMN 6) STREAM)))
;; Print the expression. Remember, Fortran ignores blanks and line
;; terminators, so we don't care where the expression is broken.
(DO ()
((= COLUMN 72.))
(IF (NULL X)
(IF $FORTSPACES (TYO #\SP STREAM) (RETURN NIL))
(progn (and (equal (car x) #/\) (setq x (cdr x)))
(TYO (POP X) STREAM)))
(INCREMENT COLUMN))
;; Columns 73 to 80 contain spaces
(IF $FORTSPACES (PRINT-SPACES 8 STREAM))
(TERPRI STREAM))
'$DONE)
(DEFUN PRINT-SPACES (N STREAM)
(DOTIMES (I N) (TYO #\SP STREAM)))
;; This function is similar to NFORMAT. Prepare an expression
;; for printing by converting x^(1/2) to sqrt(x), etc. A better
;; way of doing this would be to have a programmable printer and
;; not cons any new expressions at all. Some of this formatting, such
;; as E^X --> EXP(X) is specific to Fortran.
(DEFUN FORTSCAN (E)
(COND ((ATOM E) (cond ((eq e '$%i) '((mprogn) 0.0 1.0))
(t E))) ;%I is (0,1)
((AND (EQ (CAAR E) 'MEXPT) (EQ (CADR E) '$%E))
(LIST '($EXP SIMP) (FORTSCAN (CADDR E))))
((AND (EQ (CAAR E) 'MEXPT) (ALIKE1 (CADDR E) 1//2))
(LIST '(%SQRT SIMP) (FORTSCAN (CADR E))))
((AND (EQ (CAAR E) 'MEXPT) (ALIKE1 (CADDR E) -1//2))
(LIST '(MQUOTIENT SIMP) 1 (LIST '(%SQRT SIMP) (FORTSCAN (CADR E)))))
((AND (EQ (CAAR E) 'MTIMES) (RATNUMP (CADR E))
(MEMBER (CADADR E) '(1 -1)))
(COND ((EQUAL (CADADR E) 1) (FORTSCAN-MTIMES E))
(T (LIST '(MMINUS SIMP) (FORTSCAN-MTIMES E)))))
((EQ (CAAR E) 'RAT)
(LIST '(MQUOTIENT SIMP) (FLOAT (CADR E)) (FLOAT (CADDR E))))
((EQ (CAAR E) 'MRAT) (FORTSCAN (RATDISREP E)))
;; complex numbers to f77 syntax a+b%i ==> (a,b)
((and (memq (caar e) '(mtimes mplus))
((lambda (a)
(and (numberp (cadr a))
(numberp (caddr a))
(not (zerop1 (cadr a)))
(list '(mprogn) (caddr a) (cadr a))))
(simplify ($bothcoef e '$%i)))))
(T (CONS (CAR E) (MAPCAR 'FORTSCAN (CDR E))))))
(DEFUN FORTSCAN-MTIMES (E)
(LIST '(MQUOTIENT SIMP)
(COND ((NULL (CDDDR E)) (FORTSCAN (CADDR E)))
(T (CONS (CAR E) (MAPCAR 'FORTSCAN (CDDR E)))))
(FLOAT (CADDR (CADR E)))))
;; Takes a name and a matrix and prints a sequence of Fortran assignment
;; statements of the form
;; NAME(I,J) = <corresponding matrix element>
(DEFMFUN $FORTMX (NAME MAT &OPTIONAL (STREAM #-LISPM NIL #+LISPM STANDARD-OUTPUT)
&AUX ($LOADPRINT NIL))
(DECLARE (FIXNUM I J))
(COND ((NOT (EQ (TYPEP NAME) 'SYMBOL))
(MERROR "~%First argument to FORTMX must be a symbol."))
((NOT ($MATRIXP MAT))
(MERROR "Second argument to FORTMX not a matrix: ~M" MAT)))
(DO ((MAT (CDR MAT) (CDR MAT)) (I 1 (1+ I))) ((NULL MAT))
(DO ((M (CDAR MAT) (CDR M)) (J 1 (1+ J))) ((NULL M))
(FORTRAN-PRINT `((MEQUAL) ((,NAME) ,I ,J) ,(CAR M)) STREAM)))
'$DONE)

565
src/mrg/gram.487 Normal file
View File

@@ -0,0 +1,565 @@
;;;;;;;;;;;;;;;;;;; -*- Mode: Lisp; Package: Macsyma -*- ;;;;;;;;;;;;;;;;;;;
;;; (c) Copyright 1981 Massachusetts Institute of Technology ;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(macsyma-module gram)
;;; Notes:
;;;
;;; KMP 12/14/80 -- Modified $DO and friends (things with NUD prop of NUD-$DO)
;;; to have an LBP of 5. instead 30. New operators introduced
;;; after this time should have an LBP of 5 if they have an
;;; NUD but no LED property unless there is a *very* good
;;; reason for that not to be so.
;;;
;;; Note also that the binding powers for - are incorrectly
;;; set also. New operators with LBP's in the range 120.-130.
;;; should beware of this. My new parser scheme has the
;;; correction for this. It's too much pain right now to
;;; integrate the correct thing into this parser. Due to some
;;; inelegant and inefficient patches to special-case "-" here
;;; and there throughout this code, the user doesn't see the
;;; difference, so we can live with current lossage for now.
(LOAD-MACSYMA-MACROS MRGMAC)
(DECLARE (GENPREFIX GRM)
(SPECIAL ST1 STRING MOPL $PROPS ALIASLIST)
(*EXPR MEVAL MEVAL1 GETOP ADD2LNC REMCHK
FULLSTRIP1 STRING* WNA-ERR GETOPR REMPROPCHK $LISTP))
;; "First character" and "Pop character"
(DEFMACRO FIRST-C () `(FIRST STRING))
(DEFMACRO POP-C () `(POP STRING))
(DEFMACRO CONVERT-$ANY (X) `(CDR ,X))
(DEFMACRO MATCH (X) `(GET ,X 'MATCH))
(DEFMVAR $PARSEWINDOW 10.
"The maximum number of 'lexical tokens' that are printed out on
each side of the error-point when a syntax (parsing) error occurs. This
option is especially useful on slow terminals. Setting it to -1 causes the
entire input string to be printed out when an error occurs."
FIXNUM)
(DEFUN PARSE (MODE RBP)
(DO ((LEFT (IF (OPERATORP (FIRST-C)) (NUD (POP-C)) (CONS '$ANY (POP-C)))
(LED (POP-C) LEFT)))
((>= RBP (LBP (FIRST-C))) (CONVERT LEFT MODE))))
(DEFUN PARSE-PREFIX (OP)
(LIST (POS OP) (LIST OP) (PARSE (RPOS OP) (RBP OP))))
(DEFUN PARSE-POSTFIX (OP L)
(LIST (POS OP) (LIST OP) (CONVERT L (LPOS OP))))
(DEFUN PARSE-INFIX (OP L)
(LIST (POS OP) (LIST OP) (CONVERT L (LPOS OP)) (PARSE (RPOS OP) (RBP OP))))
(DEFUN PARSE-NARY (OP L)
(CONS (POS OP) (CONS (LIST OP) (CONS (CONVERT L (LPOS OP)) (PRSNARY OP (LPOS OP) (LBP OP))))))
(DEFUN PARSE-MATCHFIX (OP)
(CONS (POS OP) (CONS (LIST OP) (PRSMATCH (MATCH OP) (LPOS OP)))))
(DEFUN PARSE-NOFIX (OP) (LIST (POS OP) (LIST OP)))
(DEFUN PRSNARY (OP MODE RBP)
(DO ((NL (LIST (PARSE MODE RBP)) (CONS (PARSE MODE RBP) NL)))
((NOT (EQ OP (FIRST-C))) (NREVERSE NL))
(POP-C)))
(DEFUN PRSMATCH (MATCH MODE)
(COND ((EQ MATCH (FIRST-C)) (POP-C) NIL)
(T (DO ((NL (LIST (PARSE MODE 10.)) (CONS (PARSE MODE 10.) NL)))
((EQ MATCH (FIRST-C)) (POP-C) (NREVERSE NL))
(IF (EQ '|$,| (FIRST-C)) (POP-C) (MRP-ERR MATCH))))))
(DEFUN CONVERT (ITEM MODE)
(IF (OR (EQ MODE (CAR ITEM)) (EQ '$ANY MODE) (EQ '$ANY (CAR ITEM)))
(CDR ITEM)
(PARSE-ERR)))
(DEFUN OPERATORP (LEX) (OR (GET LEX 'LED) (GET LEX 'NUD)))
(DEFUN OPERATORP1 (LEX) (OR (GET LEX 'LED) (GET LEX 'NUD)
(GET LEX 'LBP) (GET LEX 'RBP)))
(DEFUN NUD (OP) (IF (GET OP 'NUD) (FUNCALL (GET OP 'NUD) OP) (UDN-ERR OP)))
(DEFUN LED (OP L) (IF (GET OP 'LED) (FUNCALL (GET OP 'LED) OP L) (UDL-ERR OP)))
(DEFMFUN LBP (LEX) (COND ((GET LEX 'LBP)) (T 200.)))
(DEFMFUN RBP (LEX) (COND ((GET LEX 'RBP)) (T 200.)))
(DEFUN LPOS (OP) (COND ((GET OP 'LPOS)) (T '$ANY)))
(DEFUN RPOS (OP) (COND ((GET OP 'RPOS)) (T '$ANY)))
(DEFUN POS (OP) (COND ((GET OP 'POS)) (T '$ANY)))
;; This is all going to have to be made to signal if it is to work through
;; ZWEI or a display front end. We can't pass format strings in MacLisp, and
;; we can't pass symbols either (address space). So I guess we use a
;; PARSE-ERROR macro which becomes PRINC on ITS. This doesn't solve the
;; problem for the ITS display front end, unless separate fasl files are used.
;; N.B. Format strings can now be passed in Maclisp on ITS due to the
;; out-of-core error-string system. So whoever wrote the above comment
;; might want to do something about it. -gjc
(DEFUN PARSE-ERR ()
(MTELL-OPEN "~%Syntax error") (PRSYNERR))
(DEFUN MRP-ERR (MATCH)
(MTELL-OPEN "~%Missing /"~A/"" (STRIPDOLLAR MATCH))
(PRSYNERR))
(DEFUN ERP-ERR (OP L) OP L ;Ignored
(MTELL-OPEN "~%Too many /)")
(PRSYNERR))
(DEFUN ERB-ERR (OP L) OP L ;Ignored
(MTELL-OPEN "~%Too many ]")
(PRSYNERR))
(DEFUN UDN-ERR (OP)
(MTELL-OPEN "~%/"~A/" is not a prefix operator." (FULLSTRIP1 OP))
(PRSYNERR))
(DEFUN UDL-ERR (OP)
(MTELL-OPEN "~%/"~A/" is not an infix operator." (FULLSTRIP1 OP))
(PRSYNERR))
(DEFUN DELIM-ERR (OP) OP ;Ignored
(MTELL-OPEN "~%Illegal use of delimiter.")
(PRSYNERR))
(DEFUN PRSYNERR ()
(IF (NULL STRING) (RPLACA (LAST ST1) '**$**)
(RPLACD STRING (CONS (CAR STRING) (CDR STRING)))
(RPLACA STRING '**$**)
(RPLACA (LAST ST1) '| |))
(TERPRI)
(COND ((NOT (= $PARSEWINDOW 0))
(COND ((NOT (= $PARSEWINDOW -1))
(COND ((NOT (NULL STRING))
(DO ((STR (LIST NIL) (CONS (CAR S) STR))
(S (CDR STRING) (CDR S)))
((OR (NULL S) (> (LENGTH STR) $PARSEWINDOW))
(RPLACD STRING (CDR (NREVERSE STR)))))))
(DO ((STR ST1 (CDR STR)))
((NOT (> (- (LENGTH STR) (LENGTH (MEMBER '**$** STR)))
$PARSEWINDOW))
(SETQ ST1 STR)))))
(MAPC #'(LAMBDA (L) (PRINC (FULLSTRIP1 L)) (TYO #\SPACE)) ST1)
(TERPRI)))
(PRINC "Please rephrase or edit.")
(IF (NOT (= $PARSEWINDOW 0)) (TERPRI))
(MERROR ""))
(DEFMFUN DEFINE-SYMBOL (SYM)
(PROG (DUMMY LEN X Y)
(SETQ DUMMY (MAPCAR 'ASCII (CASIFY-EXPLODEN SYM))
SYM (IMPLODE (CONS '$ DUMMY))
LEN (LENGTH DUMMY))
(COND ((= LEN 2)
(COND ((NOT (AND (SETQ X (GET (CAR DUMMY) 'OP2C))
(ASSOC (GETCHARN (CADR DUMMY) 1) X)))
(PUTPROP (CAR DUMMY)
(CONS (CONS (GETCHARN (CADR DUMMY) 1) SYM)
(GET (CAR DUMMY) 'OP2C))
'OP2C))))
((= LEN 3)
(SETQ Y (MAPCAR #'(LAMBDA (X) (GETCHARN X 1)) (CDR DUMMY)))
(COND ((NOT (AND (SETQ X (GET (CAR DUMMY) 'OP3C))
(ASSOC Y X)))
(PUTPROP (CAR DUMMY)
(CONS (CONS Y SYM) (GET (CAR DUMMY) 'OP3C))
'OP3C))))
; ((> LEN 3) ; This error check needs more work. - JPG
; (PRINC (FULLSTRIP1 SYM))
; (MERROR "~%User defined operators can have at most 3 characters."))
)
(RETURN SYM)))
(DEFUN KILL-OPERATOR (OP)
(REM OP 'NUD) (REM OP 'LED)
(REM OP 'LBP) (REM OP 'RBP)
(REM OP 'LPOS) (REM OP 'RPOS) (REM OP 'POS)
(REM OP 'GRIND)
(REM OP 'DIMENSION) (REM OP 'DISSYM)
(LET ((OPR (GET OP 'OP))) (REM OP 'OP) (REM OPR 'OPR) (REMPROPCHK OPR))
(SETQ OP ($NOUNIFY OP))
(REM OP 'DIMENSION) (REM OP 'DISSYM)
(REM OP 'LBP) (REM OP 'RBP))
(DEFPROP $/[ NUD-$/[ NUD)
(DEFPROP $/[ LED-$/[ LED)
(DEFPROP $/[ 200. LBP)
(DEFPROP $/] DELIM-ERR NUD)
(DEFPROP $/] ERB-ERR LED)
(DEFPROP $/] 5. LBP)
(DEFUN NUD-$/[ (OP) OP ;Ignored
(CONS '$ANY (CONS '(MLIST) (PRSMATCH '$/] '$ANY))))
(DEFUN LED-$/[ (OP LEFT) OP ;Ignored
(LET ((RIGHT))
(SETQ LEFT (CONVERT-$ANY LEFT))
(IF (NUMBERP LEFT) (PARSE-ERR))
(SETQ RIGHT (PRSMATCH '$/] '$ANY))
(IF (NULL RIGHT) (NSUB-ERR))
(CONS '$ANY
(COND ((ATOM LEFT)
(SETQ RIGHT (CONS (LIST (AMPERCHK LEFT) 'ARRAY) RIGHT))
(OR (CDR (ASSOL RIGHT ALIASLIST)) RIGHT))
(T (LIST* '(MQAPPLY ARRAY) LEFT RIGHT))))))
(DEFUN NSUB-ERR ()
(MTELL-OPEN "~%No subscripts given") (PRSYNERR))
(DEFPROP $/( NUD-$/( NUD)
(DEFPROP $/( LED-$/( LED)
(DEFPROP $/( 200. LBP)
(DEFPROP $/) DELIM-ERR NUD)
(DEFPROP $/) ERP-ERR LED)
(DEFPROP $/) 5. LBP)
(DEFUN NUD-$/( (OP) OP ;Ignored
(LET ((RIGHT))
(IF (EQ (FIRST-C) '$/)) (PARSE-ERR))
(CONS '$ANY
(COND ((OR (NULL (SETQ RIGHT (PRSMATCH '$/) '$ANY))) (CDR RIGHT))
(CONS '(MPROGN) RIGHT))
(T (CAR RIGHT))))))
(DEFUN LED-$/( (OP LEFT) OP ;Ignored
(LET ((RIGHT))
(SETQ LEFT (CONVERT-$ANY LEFT))
(IF (NUMBERP LEFT) (PARSE-ERR))
(SETQ RIGHT (PRSMATCH '$/) '$ANY))
(CONS '$ANY
(COND ((ATOM LEFT) (CONS (NCONS (AMPERCHK LEFT)) RIGHT))
(T (LIST* '(MQAPPLY) LEFT RIGHT))))))
(DEFPROP $/' NUD-$/' NUD)
(DEFUN NUD-$/' (OP) OP ;Ignored
(LET ((RIGHT))
(CONS '$ANY
(COND ((EQ (FIRST-C) '$/()
(LIST '(MQUOTE) (PARSE '$ANY 190.)))
((OR (ATOM (SETQ RIGHT (PARSE '$ANY 190.)))
(MEMQ (CAAR RIGHT)
'(MQUOTE MLIST MPROG MPROGN LAMBDA MDO MDOIN)))
(LIST '(MQUOTE) RIGHT))
((EQ (CAAR RIGHT) 'MQAPPLY)
(COND ((EQ (CAAADR RIGHT) 'LAMBDA)
(LIST '(MQUOTE) RIGHT))
(T (RPLACA (CDR RIGHT)
(CONS (CONS ($NOUNIFY (CAAADR RIGHT))
(CDAADR RIGHT))
(CDADR RIGHT)))
RIGHT)))
(T (CONS (CONS ($NOUNIFY (CAAR RIGHT)) (CDAR RIGHT))
(CDR RIGHT)))))))
(DEFPROP |$''| |NUD-$''| NUD)
(DEFUN |NUD-$''| (OP) OP ;Ignored
(LET ((RIGHT))
(CONS '$ANY
(COND ((EQ (FIRST-C) '$/() (MEVAL (PARSE '$ANY 190.)))
((ATOM (SETQ RIGHT (PARSE '$ANY 190.))) (MEVAL1 RIGHT))
((EQ (CAAR RIGHT) 'MQAPPLY)
(RPLACA (CDR RIGHT)
(CONS (CONS ($VERBIFY (CAAADR RIGHT))
(CDAADR RIGHT))
(CDADR RIGHT)))
RIGHT)
(T (CONS (CONS ($VERBIFY (CAAR RIGHT)) (CDAR RIGHT))
(CDR RIGHT)))))))
(DEFPROP |$:| |LED-$:| LED)
(DEFPROP |$:| 180. LBP)
(DEFUN |LED-$:| (OP LEFT) OP ;Ignored
(LIST '$ANY '(MSETQ) (CDR LEFT) (PARSE '$ANY 20.)))
(DEFPROP |$::| |LED-$::| LED)
(DEFPROP |$::| 180. LBP)
(DEFUN |LED-$::| (OP LEFT) OP ;Ignored
(LIST '$ANY '(MSET) (CDR LEFT) (PARSE '$ANY 20.)))
(DEFPROP |$:=| |LED-$:=| LED)
(DEFPROP |$:=| 180. LBP)
(DEFUN |LED-$:=| (OP LEFT) OP ;Ignored
(COND ((ATOM (CDR LEFT)) (ATM-ERR))
(T (LIST '$ANY '(MDEFINE) (CDR LEFT) (PARSE '$ANY 20.)))))
(DEFPROP |$::=| |LED-$::=| LED)
(DEFPROP |$::=| 180. LBP)
(DEFUN |LED-$::=| (OP LEFT) OP ;Ignored
(LIST '$ANY '(MDEFMACRO) (CDR LEFT) (PARSE '$ANY 20.)))
(DEFUN ATM-ERR ()
(MTELL-OPEN "~%Atom passed to /":=/" or /"::=/"; try /":/"")
(PRSYNERR))
(DEFPROP $! LED-$! LED)
(DEFPROP $! 160. LBP)
(DEFUN LED-$! (OP LEFT) OP ;Ignored
(LIST '$EXPR '(MFACTORIAL) (CONVERT LEFT '$EXPR)))
(DEFPROP $!! LED-$!! LED)
(DEFPROP $!! 160. LBP)
(DEFUN LED-$!! (OP LEFT) OP ;Ignored
(LIST '$EXPR '($GENFACT) (CONVERT LEFT '$EXPR)
(LIST '(MQUOTIENT) (CONVERT LEFT '$EXPR) 2) 2))
(DEFPROP $^ LED-$^ LED)
(DEFPROP $^ 140. LBP)
(DEFPROP $** LED-$^ LED)
(DEFPROP $** 140. LBP)
(DEFUN LED-$^ (OP LEFT) OP ;Ignored
(SETQ LEFT (LIST '(MEXPT) (CONVERT LEFT '$EXPR)
(COND ((EQ '$- (FIRST-C)) (POP-C) (LIST '(MMINUS) (PARSE '$EXPR 139.)))
(T (PARSE '$EXPR 139.)))))
(CONS '$EXPR (COND ((CDR (ASSOL LEFT ALIASLIST))) (T LEFT))))
(DEFPROP $^^ LED-$^^ LED)
(DEFPROP $^^ 135. LBP)
(DEFUN LED-$^^ (OP LEFT) OP ;Ignored
(SETQ LEFT (LIST '(MNCEXPT) (CONVERT LEFT '$EXPR)
(IFN (EQ '$- (FIRST-C)) (PARSE '$EXPR 134.)
(POP-C) (LIST '(MMINUS) (PARSE '$EXPR 134.)))))
(CONS '$EXPR (COND ((CDR (ASSOL LEFT ALIASLIST))) (T LEFT))))
(DEFPROP $/. LED-$/. LED)
(DEFPROP $/. 110. LBP)
(DEFUN LED-$/. (OP LEFT) OP ;Ignored
(LIST '$EXPR '(MNCTIMES) (CONVERT LEFT '$EXPR) (PARSE '$EXPR 109.)))
(DEFPROP $* LED-$* LED)
(DEFPROP $* 120. LBP)
(DEFUN LED-$* (OP LEFT) OP ;Ignored
(LIST* '$EXPR '(MTIMES) (CONVERT LEFT '$EXPR) (PRSNARY '$* '$EXPR 120.)))
(DEFPROP $// LED-$// LED)
(DEFPROP $// 120. LBP)
(DEFUN LED-$// (OP LEFT) OP ;Ignored
(LIST '$EXPR '(MQUOTIENT) (CONVERT LEFT '$EXPR) (PARSE '$EXPR 120.)))
(DEFPROP $+ NUD-$+ NUD)
(DEFPROP $+ LED-$+ LED)
(DEFPROP $+ 100. LBP)
(DEFUN NUD-$+ (OP) OP ;Ignored
(COND ((MEMQ (FIRST-C) '($+ $-)) (PARSE-ERR))
(T (LIST '$EXPR '(MPLUS) (PARSE '$EXPR 100.)))))
(DEFUN LED-$+ (OP LEFT) OP ;Ignored
(DO ((NL (LIST (PARSE '$EXPR 100.) (CONVERT LEFT '$EXPR))))
(NIL)
(COND ((EQ '$+ (FIRST-C)) (POP-C) (SETQ NL (CONS (PARSE '$EXPR 100.) NL)))
((EQ '$- (FIRST-C)) (POP-C)
(SETQ NL (CONS (LIST '(MMINUS) (PARSE '$EXPR 100.)) NL)))
(T (RETURN (CONS '$EXPR (CONS '(MPLUS) (NREVERSE NL))))))))
(DEFPROP $- NUD-$- NUD)
(DEFPROP $- LED-$- LED)
(DEFPROP $- 100. LBP)
(DEFUN NUD-$- (OP) OP ;Ignored
(IF (EQ '$+ (FIRST-C)) (PARSE-ERR)
(LIST '$EXPR '(MMINUS) (PARSE '$EXPR 100.))))
(DEFUN LED-$- (OP LEFT) OP ;Ignored
(DO ((NL (LIST (LIST '(MMINUS) (PARSE '$EXPR 100.)) (CONVERT LEFT '$EXPR)))) (NIL)
(COND ((EQ '$+ (FIRST-C)) (POP-C)
(SETQ NL (CONS (PARSE '$EXPR 100.) NL)))
((EQ '$- (FIRST-C)) (POP-C)
(SETQ NL (CONS (LIST '(MMINUS) (PARSE '$EXPR 100.)) NL)))
(T (RETURN (CONS '$EXPR (CONS '(MPLUS) (NREVERSE NL))))))))
(DEFPROP $= LED-$= LED)
(DEFPROP $= 80. LBP)
(DEFUN LED-$= (OP LEFT) OP ;Ignored
`($CLAUSE (MEQUAL) ,(CONVERT LEFT '$EXPR) ,(PARSE '$EXPR 80.)))
(DEFPROP $/# LED-$/# LED)
(DEFPROP $/# 80. LBP)
(DEFUN LED-$/# (OP LEFT) OP ;Ignored
`($CLAUSE (MNOTEQUAL) ,(CONVERT LEFT '$EXPR) ,(PARSE '$EXPR 80.)))
(DEFPROP $/> NUD-$/> NUD)
(DEFUN NUD-$/> (OP) OP ;Ignored
'($ANY . $/>))
(DEFPROP $/> LED-$/> LED)
(DEFPROP $/> 80. LBP)
(DEFUN LED-$/> (OP LEFT) OP ;Ignored
`($CLAUSE (MGREATERP) ,(CONVERT LEFT '$EXPR) ,(PARSE '$EXPR 80.)))
(DEFPROP $/>= LED-$/>= LED)
(DEFPROP $/>= 80. LBP)
(DEFUN LED-$/>= (OP LEFT) OP ;Ignored
`($CLAUSE (MGEQP) ,(CONVERT LEFT '$EXPR) ,(PARSE '$EXPR 80.)))
(DEFPROP $/< LED-$/< LED)
(DEFPROP $/< 80. LBP)
(DEFUN LED-$/< (OP LEFT) OP ;Ignored
`($CLAUSE (MLESSP) ,(CONVERT LEFT '$EXPR) ,(PARSE '$EXPR 80.)))
(DEFPROP $/<= LED-$/<= LED)
(DEFPROP $/<= 80. LBP)
(DEFUN LED-$/<= (OP LEFT) OP ;Ignored
`($CLAUSE (MLEQP) ,(CONVERT LEFT '$EXPR) ,(PARSE '$EXPR 80.)))
(DEFPROP $NOT NUD-$NOT NUD)
(DEFUN NUD-$NOT (OP) OP ;Ignored
`($CLAUSE (MNOT) ,(PARSE '$CLAUSE 70.)))
(DEFPROP $AND LED-$AND LED)
(DEFPROP $AND 60. LBP)
(DEFUN LED-$AND (OP LEFT) OP ;Ignored
`($CLAUSE (MAND) ,(CONVERT LEFT '$CLAUSE) . ,(PRSNARY '$AND '$CLAUSE 60.)))
(DEFPROP $OR LED-$OR LED)
(DEFPROP $OR 50. LBP)
(DEFUN LED-$OR (OP LEFT) OP ;Ignored
`($CLAUSE (MOR) ,(CONVERT LEFT '$CLAUSE) . ,(PRSNARY '$OR '$CLAUSE 50.)))
(DEFPROP $/, LED-$/, LED)
(DEFPROP $/, 10. LBP)
(DEFUN LED-$/, (OP LEFT) OP ;Ignored
`($ANY ($EV) ,(CDR LEFT) . ,(PRSNARY '$/, '$ANY 10.)))
(DEFPROP $IF NUD-$IF NUD)
(DEFPROP $THEN DELIM-ERR NUD)
(DEFPROP $THEN 5. LBP)
(DEFPROP $ELSE DELIM-ERR NUD)
(DEFPROP $ELSE 5. LBP)
(DEFUN NUD-$IF (OP) OP ;Ignored
(LIST '$ANY '(MCOND)
(PARSE '$CLAUSE 45.)
(COND ((EQ '$THEN (FIRST-C)) (POP-C) (PARSE '$ANY 25.))
(T (TERPRI) (PRINC '|Missing "THEN"|) (PRSYNERR)))
T
(COND ((EQ '$ELSE (FIRST-C)) (POP-C) (PARSE '$ANY 25.)) (T '$FALSE))))
(DEFPROP $FOR NUD-$DO NUD)
(DEFPROP $FOR 5. LBP)
(DEFPROP $FROM NUD-$DO NUD)
(DEFPROP $FROM 5. LBP)
(DEFPROP $STEP NUD-$DO NUD)
(DEFPROP $STEP 5. LBP)
(DEFPROP $NEXT NUD-$DO NUD)
(DEFPROP $NEXT 5. LBP)
(DEFPROP $THRU NUD-$DO NUD)
(DEFPROP $THRU 5. LBP)
(DEFPROP $UNLESS NUD-$DO NUD)
(DEFPROP $UNLESS 5. LBP)
(DEFPROP $WHILE NUD-$DO NUD)
(DEFPROP $WHILE 5. LBP)
(DEFPROP $DO NUD-$DO NUD)
(DEFPROP $DO 5. LBP)
(DEFUN NUD-$DO (LEX)
(DO ((OP LEX (POP-C)) (LEFT (MAKE-MDO)))
((EQ '$DO OP) (SETF (MDO-BODY LEFT) (PARSE '$ANY 25.))
(CONS '$ANY LEFT))
(COND ((AND (EQ '$FOR OP) (NULL (MDO-FOR LEFT)))
(SETF (MDO-FOR LEFT) (PARSE '$ANY 200.)))
((AND (OR (EQ '$FROM OP) (EQ '$/: OP))
(NULL (MDO-FROM LEFT))
(EQ 'MDO (MDO-OP LEFT)))
(SETF (MDO-FROM LEFT) (PARSE '$ANY 95.)))
((AND (EQ '$IN OP) (NULL (MDO-STEP LEFT)) (NULL (MDO-NEXT LEFT)))
(SETF (MDO-OP LEFT) 'MDOIN)
(SETF (MDO-FROM LEFT) (PARSE '$ANY 95.)))
((AND (EQ '$STEP OP) (NULL (MDO-STEP LEFT)) (NULL (MDO-NEXT LEFT))
(EQ 'MDO (MDO-OP LEFT)))
(SETF (MDO-STEP LEFT) (PARSE '$EXPR 95.)))
((AND (EQ '$NEXT OP) (NULL (MDO-NEXT LEFT)) (NULL (MDO-STEP LEFT))
(EQ 'MDO (MDO-OP LEFT)))
(SETF (MDO-NEXT LEFT) (PARSE '$ANY 45.)))
((AND (EQ '$THRU OP) (NULL (MDO-THRU LEFT)))
(SETF (MDO-THRU LEFT) (PARSE '$EXPR 95.)))
((EQ '$WHILE OP)
(SETF (MDO-UNLESS LEFT)
(COND ((NULL (MDO-UNLESS LEFT)) (LIST '(MNOT) (PARSE '$CLAUSE 45.)))
(T (LIST '(MOR) (MDO-UNLESS LEFT)
(LIST '(MNOT) (PARSE '$CLAUSE 45.)))))))
((EQ '$UNLESS OP)
(SETF (MDO-UNLESS LEFT)
(COND ((NULL (MDO-UNLESS LEFT)) (PARSE '$CLAUSE 45.))
(T (LIST '(MOR) (MDO-UNLESS LEFT) (PARSE '$CLAUSE 45.))))))
(T (PARSE-ERR)))))
(DEFPROP |$;| |NUD-$;| NUD)
(DEFPROP |$;| |LED-$;| LED)
(DEFPROP |$;| -1 LBP)
(DEFUN |NUD-$;| (OP) OP ;Ignored
(MTELL-OPEN "Premature termination of input.")
(PRSYNERR))
(DEFUN |LED-$;| (OP LEFT) OP ;Ignored
(CDR LEFT))
;; Local Modes:
;; Mode: LISP
;; Comment Col: 40
;; END:

427
src/mrg/grind.153 Normal file
View File

@@ -0,0 +1,427 @@
;;;;;;;;;;;;;;;;;;; -*- 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))))

118
src/mrg/nforma.18 Normal file
View File

@@ -0,0 +1,118 @@
;;;;;;;;;;;;;;;;;;; -*- Mode: Lisp; Package: Macsyma -*- ;;;;;;;;;;;;;;;;;;;
;;; (c) Copyright 1982 Massachusetts Institute of Technology ;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(macsyma-module nforma)
(DECLARE (SPECIAL 1//2 -1//2 DISPLAYP ALIASLIST IN-P))
(DEFMVAR $POWERDISP NIL)
(DEFMVAR $PFEFORMAT NIL)
(DEFMVAR $%EDISPFLAG NIL)
(DEFMVAR $EXPTDISPFLAG T)
(DEFMVAR $SQRTDISPFLAG T)
(DEFMVAR $NEGSUMDISPFLAG T)
(SETQ IN-P NIL)
(DEFMFUN NFORMAT (FORM)
(COND ((ATOM FORM)
(COND ((AND (NUMBERP FORM) (MINUSP FORM)) (LIST '(MMINUS) (MINUS FORM)))
((EQ T FORM) (IF IN-P T '$TRUE))
((EQ NIL FORM) (IF IN-P NIL '$FALSE))
((AND DISPLAYP (CAR (ASSQR FORM ALIASLIST))))
(T FORM)))
((ATOM (CAR FORM)) FORM)
((EQ 'RAT (CAAR FORM))
(COND ((MINUSP (CADR FORM))
(LIST '(MMINUS) (LIST '(RAT) (MINUS (CADR FORM)) (CADDR FORM))))
(T (CONS '(RAT) (CDR FORM)))))
((EQ 'MMACROEXPANDED (CAAR FORM)) (NFORMAT (CADDR FORM)))
((NULL (CDAR FORM)) FORM)
((EQ 'MPLUS (CAAR FORM)) (FORM-MPLUS FORM))
((EQ 'MTIMES (CAAR FORM)) (FORM-MTIMES FORM))
((EQ 'MEXPT (CAAR FORM)) (FORM-MEXPT FORM))
((EQ 'MRAT (CAAR FORM)) (FORM-MRAT FORM))
((EQ 'MPOIS (CAAR FORM)) (NFORMAT ($OUTOFPOIS FORM)))
((EQ 'BIGFLOAT (CAAR FORM))
(IF (MINUSP (CADR FORM))
(LIST '(MMINUS) (LIST (CAR FORM) (MINUS (CADR FORM)) (CADDR FORM)))
(CONS (CAR FORM) (CDR FORM))))
(T FORM)))
(DEFUN FORM-MPLUS (FORM &AUX ARGS TRUNC)
(SETQ ARGS (MAPCAR #'NFORMAT (CDR FORM)))
(SETQ TRUNC (MEMQ 'TRUNC (CDAR FORM)))
(CONS (IF TRUNC '(MPLUS TRUNC) '(MPLUS))
(COND ((AND (MEMQ 'RATSIMP (CDAR FORM)) (NOT (MEMQ 'SIMP (CDAR FORM))))
(IF $POWERDISP (NREVERSE ARGS) ARGS))
((AND TRUNC (NOT (MEMQ 'SIMP (CDAR FORM)))) (NREVERSE ARGS))
((OR $POWERDISP TRUNC (MEMQ 'CF (CDAR FORM))) ARGS)
((AND $NEGSUMDISPFLAG (NULL (CDDDR FORM)))
(IF (AND (NOT (MMMINUSP (CAR ARGS)))
(MMMINUSP (CADR ARGS)))
ARGS
(NREVERSE ARGS)))
(T (NREVERSE ARGS)))))
(DEFUN FORM-MTIMES (FORM)
(COND ((NULL (CDR FORM)) '((MTIMES)))
((EQUAL -1 (CADR FORM)) (LIST '(MMINUS) (FORM-MTIMES (CDR FORM))))
(T (PROG (NUM DEN MINUS FLAG)
(DO ((L (CDR FORM) (CDR L)) (DUMMY)) ((NULL L))
(SETQ DUMMY (NFORMAT (CAR L)))
(COND ((ATOM DUMMY) (SETQ NUM (CONS DUMMY NUM)))
((EQ 'MMINUS (CAAR DUMMY))
(SETQ MINUS (NOT MINUS) L (APPEND DUMMY (CDR L))))
((OR (EQ 'MQUOTIENT (CAAR DUMMY))
(AND (NOT $PFEFORMAT) (EQ 'RAT (CAAR DUMMY))))
(COND ((NOT (EQUAL 1 (CADR DUMMY)))
(SETQ NUM (CONS (CADR DUMMY) NUM))))
(SETQ DEN (CONS (CADDR DUMMY) DEN)))
(T (SETQ NUM (CONS DUMMY NUM)))))
(SETQ NUM (COND ((NULL NUM) 1)
((NULL (CDR NUM)) (CAR NUM))
(T (CONS '(MTIMES) (NREVERSE NUM))))
DEN (COND ((NULL DEN) (SETQ FLAG T) NIL)
((NULL (CDR DEN)) (CAR DEN))
(T (CONS '(MTIMES) (NREVERSE DEN)))))
(IF (NOT FLAG) (SETQ NUM (LIST '(MQUOTIENT) NUM DEN)))
(RETURN (IF MINUS (LIST '(MMINUS) NUM) NUM))))))
(DEFUN FORM-MEXPT (FORM &AUX EXP)
(COND ((AND $SQRTDISPFLAG (ALIKE1 1//2 (CADDR FORM))) (LIST '(%SQRT) (CADR FORM)))
((AND $SQRTDISPFLAG (ALIKE1 -1//2 (CADDR FORM)))
(LIST '(MQUOTIENT) 1 (LIST '(%SQRT) (CADR FORM))))
((AND (OR (AND $%EDISPFLAG (EQ '$%E (CADR FORM)))
(AND $EXPTDISPFLAG (NOT (EQ '$%E (CADR FORM)))))
(NOT (ATOM (SETQ EXP (NFORMAT (CADDR FORM)))))
(EQ 'MMINUS (CAAR EXP)))
(LIST '(MQUOTIENT) 1 (IF (EQUAL 1 (CADR EXP)) (CADR FORM)
(LIST '(MEXPT) (CADR FORM) (CADR EXP)))))
(T (CONS '(MEXPT) (CDR FORM)))))
(DEFUN FORM-MRAT (FORM)
(LET ((TRUNC (MEMQ 'TRUNC (CDAR FORM))) EXACT)
(IF (AND TRUNC (EQ (CADR FORM) 'PS))
(SETQ EXACT (NULL (CAR (CADDDR FORM)))))
(SETQ FORM (RATDISREPD FORM))
(RDIS1 FORM)
(IF (AND TRUNC (OR (ATOM FORM)
;; A constant, e.g. ((mplus) $a 1)
(not (member (car form)
'((mplus exact) (mplus trunc))))))
(CONS (IF EXACT '(MPLUS EXACT) '(MPLUS TRUNC)) (NCONS FORM))
(NFORMAT FORM))))
(DEFUN RDIS1 (FORM)
(COND ((OR (ATOM FORM) (SPECREPP FORM)))
((NULL (CDAR FORM)) (RPLACA FORM (LIST (CAAR FORM) 'RATSIMP)))
(T (MAPC #'RDIS1 (CDR FORM)))))
(DEFMFUN NFORMAT-ALL (FORM)
(SETQ FORM (NFORMAT FORM))
(IF (OR (ATOM FORM) (EQ (CAAR FORM) 'BIGFLOAT))
FORM
(CONS (DELSIMP (CAR FORM))
(IF (MEMQ (CAAR FORM) '(MDO MDOIN))
(MAPCAR #'(LAMBDA (U) (IF U (NFORMAT-ALL U))) (CDR FORM))
(MAPCAR #'NFORMAT-ALL (CDR FORM))))))

146
src/mrg/optim.16 Normal file
View File

@@ -0,0 +1,146 @@
;;; -*- Mode:LISP; Package:MACSYMA -*-
; ** (c) Copyright 1982 Massachusetts Institute of Technology **
(macsyma-module optim)
(DECLARE (SPECIAL VARS SETQS OPTIMCOUNT XVARS)
(FIXNUM N (OPT-HASH))
(ARRAY* (NOTYPE (SUBEXP 1)))
(UNSPECIAL ARGS))
(ARRAY SUBEXP T 64.)
(DEFMVAR $OPTIMPREFIX '$%)
(DEFMVAR $OPTIMWARN T "warns if OPTIMIZE encounters a special form.")
;; $OPTIMIZE takes a Macsyma expression and returns a BLOCK form which is
;; equivalent, but which uses local variables to store the results of computing
;; common subexpressions. These subexpressions are found by hashing them.
(DEFMFUN $OPTIMIZE (X0)
(LET (($OPTIMWARN $OPTIMWARN))
(PROG (VARS SETQS OPTIMCOUNT XVARS X)
(SETQ OPTIMCOUNT 0 XVARS (CDR ($LISTOFVARS X0)))
(FILLARRAY 'SUBEXP '(NIL))
(SETQ X (COLLAPSE (OPFORMAT (COLLAPSE X0))))
(IF (ATOM X) (RETURN X))
(COMEXP X)
(SETQ X (OPTIM X))
(RETURN (PROG1 (COND ((NULL VARS) X0)
(T (IF (OR (NOT (EQ (CAAR X) 'MPROG))
(AND ($LISTP (CADR X)) (CDADR X)))
(SETQ X (NREVERSE (CONS X SETQS)))
(SETQ X (NCONC (NREVERSE SETQS) (CDDR X))))
`((MPROG SIMP) ((MLIST) . ,(NREVERSE VARS)) . ,X)))
(FILLARRAY 'SUBEXP '(NIL)))))))
(DEFUN OPFORMAT (X)
(COND ((ATOM X) X)
((SPECREPP X) (OPFORMAT (SPECDISREP X)))
((AND $OPTIMWARN
(MSPECFUNP (CAAR X))
(PROG2 (MTELL "OPTIMIZE has met up with a special form - ~
answer may be wrong.")
(SETQ $OPTIMWARN NIL))))
((EQ (CAAR X) 'MEXPT) (OPMEXPT X))
(T (LET ((NEWARGS (MAPCAR #'OPFORMAT (CDR X))))
(IF (ALIKE NEWARGS (CDR X)) X (CONS (CAR X) NEWARGS))))))
(DEFUN OPMEXPT (X)
(LET ((*BASE (OPFORMAT (CADR X))) (EXP (OPFORMAT (CADDR X))) XNEW NEGEXP)
(SETQ NEGEXP
(COND ((AND (NUMBERP EXP) (MINUSP EXP)) (MINUS EXP))
((AND (RATNUMP EXP) (MINUSP (CADR EXP)))
(LIST (CAR EXP) (MINUS (CADR EXP)) (CADDR EXP)))
((AND (MTIMESP EXP) (NUMBERP (CADR EXP)) (MINUSP (CADR EXP)))
(IF (EQUAL (CADR EXP) -1)
(IF (NULL (CDDDR EXP)) (CADDR EXP)
(CONS (CAR EXP) (CDDR EXP)))
(LIST* (CAR EXP) (MINUS (CADR EXP)) (CDDR EXP))))
((AND (MTIMESP EXP) (RATNUMP (CADR EXP)) (MINUSP (CADADR EXP)))
(LIST* (CAR EXP)
(LIST (CAADR EXP) (MINUS (CADADR EXP)) (CADDR (CADR EXP)))
(CDDR EXP)))))
(SETQ XNEW
(COND (NEGEXP
`((MQUOTIENT)
1
,(COND ((EQUAL NEGEXP 1) *BASE)
(T (SETQ XNEW (LIST (CAR X) *BASE NEGEXP))
(IF (AND (RATNUMP NEGEXP) (EQUAL (CADDR NEGEXP) 2))
(OPMEXPT XNEW)
XNEW)))))
((AND (RATNUMP EXP) (EQUAL (CADDR EXP) 2))
(SETQ EXP (CADR EXP))
(IF (EQUAL EXP 1) `((%SQRT) ,*BASE)
`((MEXPT) ((%SQRT) ,*BASE) ,EXP)))
(T (LIST (CAR X) *BASE EXP))))
(IF (ALIKE1 X XNEW) X XNEW)))
(DEFMFUN $COLLAPSE (X)
(FILLARRAY 'SUBEXP '(NIL))
(PROG1 (COLLAPSE X) (FILLARRAY 'SUBEXP '(NIL))))
(DEFUN COLLAPSE (X)
(COND ((ATOM X) X)
((SPECREPP X) (COLLAPSE (SPECDISREP X)))
(T (LET ((N (OPT-HASH (CAAR X))))
(DO ((L (CDR X) (CDR L)))
((NULL L))
(IF (NOT (EQ (COLLAPSE (CAR L)) (CAR L)))
(RPLACA L (COLLAPSE (CAR L))))
(SETQ N (\ (+ (OPT-HASH (CAR L)) N) 12553.)))
(SETQ N (LOGAND 63. N))
(DO ((L (SUBEXP N) (CDR L)))
((NULL L) (STORE (SUBEXP N) (CONS (LIST X) (SUBEXP N))) X)
(IF (ALIKE1 X (CAAR L)) (RETURN (CAAR L))))))))
(DEFUN COMEXP (X)
(IF (NOT (OR (ATOM X) (EQ (CAAR X) 'RAT)))
(LET ((N (OPT-HASH (CAAR X))))
(DOLIST (U (CDR X)) (SETQ N (\ (+ (OPT-HASH U) N) 12553.)))
(SETQ X (ASSOL X (SUBEXP (LOGAND 63. N))))
(COND ((NULL (CDR X)) (RPLACD X 'SEEN) (MAPC #'COMEXP (CDAR X)))
(T (RPLACD X 'COMEXP))))))
(DEFUN OPTIM (X)
(COND ((ATOM X) X)
((AND (MEMQ 'ARRAY (CDAR X))
(NOT (EQ (CAAR X) 'MQAPPLY))
(NOT (MGET (CAAR X) 'ARRAYFUN-MODE)))
X)
((EQ (CAAR X) 'RAT) X)
(T (LET ((N (OPT-HASH (CAAR X))) (NX (LIST (CAR X))))
(DOLIST (U (CDR X))
(SETQ N (\ (+ (OPT-HASH U) N) 12553.)
NX (CONS (OPTIM U) NX)))
(SETQ X (ASSOL X (SUBEXP (LOGAND 63. N))) NX (NREVERSE NX))
(COND ((EQ (CDR X) 'SEEN) NX)
((EQ (CDR X) 'COMEXP)
(RPLACD X (GETOPTIMVAR))
(SETQ SETQS (CONS `((MSETQ) ,(CDR X) ,NX) SETQS))
(CDR X))
(T (CDR X)))))))
(DEFUN OPT-HASH (EXP) ; EXP is in general representation.
(\ (IF (ATOM EXP)
(SXHASH EXP)
(DO ((N (OPT-HASH (CAAR EXP)))
(ARGS (CDR EXP) (CDR ARGS)))
((NULL ARGS) N)
(SETQ N (\ (+ (OPT-HASH (CAR ARGS)) N) 12553.))))
12553.)) ; a prime number < 2^14 ; = PRIME(1500)
(DEFUN GETOPTIMVAR ()
(PROG (VAR)
LOOP (INCREMENT OPTIMCOUNT)
(SETQ VAR (INTERN #-Lispm (MAKNAM (NCONC (EXPLODEN $OPTIMPREFIX)
(MEXPLODEN OPTIMCOUNT)))
#+Lispm (MAKE-SYMBOL
(FORMAT NIL "~A~D" $OPTIMPREFIX OPTIMCOUNT))))
(IF (MEMQ VAR XVARS) (GO LOOP))
(SETQ VARS (CONS VAR VARS))
(RETURN VAR)))

55
src/mrg/scs.61 Normal file
View File

@@ -0,0 +1,55 @@
;;;;;;;;;;;;;;;;;;; -*- Mode: Lisp; Package: Macsyma -*- ;;;;;;;;;;;;;;;;;;;
;;; (c) Copyright 1980 Massachusetts Institute of Technology ;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(macsyma-module scs)
(DECLARE (*EXPR $RATSUBST CONSSIZE))
(DEFMFUN $SCSIMP N
(DO ((I N (1- I)) (ZRS)) ((= 1 I) (SCS (ARG 1) ZRS))
(SETQ ZRS (CONS (IFN (EQ 'MEQUAL (CAAR (ARG I))) (ARG I)
(SUB (CADR (ARG I)) (CADDR (ARG I)))) ZRS))))
(DEFUN SCS (X ZRS)
(DO ((FLAG T) (SZ (CONSSIZE X)) (NX) (NSZ)) ((NOT FLAG) X)
(DO ((L ZRS (CDR L))) ((NULL L) (SETQ FLAG NIL))
(SETQ NX (SUBSCS 0 (CAR L) X) NSZ (CONSSIZE NX))
(IF (< NSZ SZ) (RETURN (SETQ X NX SZ NSZ))))))
(DEFUN SUBSCS (A B C)
(COND ((ATOM B) (SUBSC A B C))
((EQ 'MPLUS (CAAR B))
(DO ((L (CDR B) (CDR L)) (SZ (CONSSIZE C)) (NL) (NC) (NSZ)) ((NULL L) C)
(SETQ NC (SUBSCS (SUB A (ADDN (RECONC NL (CDR L)) T)) (CAR L) C)
NSZ (CONSSIZE NC) NL (CONS (CAR L) NL))
(IF (< NSZ SZ) (SETQ C NC SZ NSZ))))
(T (SUBSC A B C))))
(DEFUN SUBSC (A B C) ($EXPAND ($RATSUBST A B C)))
(DEFMFUN $DISTRIB (EXP)
(COND ((OR (MNUMP EXP) (SYMBOLP EXP)) EXP)
((EQ 'MTIMES (CAAR EXP))
(SETQ EXP (MAPCAR '$DISTRIB (CDR EXP)))
(DO ((L (CDR EXP) (CDR L))
(NL (IF (MPLUSP (CAR EXP)) (CDAR EXP) (LIST (CAR EXP)))))
((NULL L) (ADDN NL T))
(IF (MPLUSP (CAR L))
(DO ((M (CDAR L) (CDR M)) (ML)) ((NULL M) (SETQ NL ML))
(SETQ ML (DSTRB (CAR M) NL ML)))
(SETQ NL (DSTRB (CAR L) NL NIL)))))
((EQ 'MEQUAL (CAAR EXP))
(LIST '(MEQUAL) ($DISTRIB (CADR EXP)) ($DISTRIB (CADDR EXP))))
((EQ 'MRAT (CAAR EXP)) ($DISTRIB (RATDISREP EXP)))
(T EXP)))
(DEFUN DSTRB (X L NL)
(DO () ((NULL L) NL)
(SETQ NL (CONS (MUL X (CAR L)) NL) L (CDR L))))
(DEFMFUN $FACOUT (X Y)
(IFN (AND (NOT (ATOM Y))
(EQ 'MPLUS (CAAR Y))) Y
(MUL X (ADDN (MAPCAR #'(LAMBDA (L) (DIV L X)) (CDR Y)) T))))

636
src/mrg/trigi.358 Normal file
View File

@@ -0,0 +1,636 @@
;; -*- Mode: Lisp; Package: Macsyma; -*-
;; (c) Copyright 1976, 1984 Massachusetts Institute of Technology
;; All Rights Reserved.
;; Enhancements (c) Copyright 1984 Symbolics Inc.
;; All Rights Reserved.
;; The data and information in the Enhancements are proprietary to, and
;; a valuable trade secret of, SYMBOLICS, INC., a Delaware corporation.
;; They are given in confidence by SYMBOLICS, pursuant to the license
;; agreement between Symbolics and their recipient, and may not be used,
;; reproduced, or copied, or distributed to any other party, in whole or
;; in part, without the prior written consent of SYMBOLICS except as
;; permitted by the license agreement.
(macsyma-module trigi)
(LOAD-MACSYMA-MACROS MRGMAC)
(DECLARE (GENPREFIX TRI)
(SPECIAL VARLIST ERRORSW $DEMOIVRE)
(FLONUM (TAN) (COT) (SEC) (CSC)
(ATAN2) (ATAN1) (ACOT)
(SINH) (COSH) (TANH) (COTH) (CSCH) (SECH)
(ASINH) (ACSCH)
(T//$ FLONUM FLONUM NOTYPE))
(*EXPR $BFLOAT TEVAL SIGNUM1 ZEROP1 ISLINEAR EXPAND1
TIMESK ADDK INTEGERP EVOD LOGARC
MEVENP EQTEST HALFANGLE COEFF))
(DEFMVAR $%PIARGS T)
(DEFMVAR $%IARGS T)
(DEFMVAR $TRIGINVERSES '$ALL)
(DEFMVAR $TRIGEXPAND NIL)
(DEFMVAR $TRIGEXPANDPLUS T)
(DEFMVAR $TRIGEXPANDTIMES T)
(DEFMVAR $TRIGSIGN T)
(DEFMVAR $EXPONENTIALIZE NIL)
(DEFMVAR $LOGARC NIL)
(DEFMVAR $HALFANGLES NIL)
(DEFMVAR 1//2 '((RAT SIMP) 1 2))
(DEFMVAR -1//2 '((RAT SIMP) -1 2))
(DEFMVAR %PI//4 '((MTIMES SIMP) ((RAT SIMP) 1 4.) $%PI))
(DEFMVAR %PI//2 '((MTIMES SIMP) ((RAT SIMP) 1 2) $%PI))
(DEFMVAR SQRT2//2 '((MTIMES SIMP) ((RAT SIMP) 1 2)
((MEXPT SIMP) 2 ((RAT SIMP) 1 2))))
(DEFMVAR -SQRT2//2 '((MTIMES SIMP) ((RAT SIMP) -1 2)
((MEXPT SIMP) 2 ((RAT SIMP) 1 2))))
(DEFMVAR SQRT3//2 '((MTIMES SIMP) ((RAT SIMP) 1 2)
((MEXPT SIMP) 3 ((RAT SIMP) 1 2))))
(DEFMVAR -SQRT3//2 '((MTIMES SIMP) ((RAT SIMP) -1 2)
((MEXPT SIMP) 3 ((RAT SIMP) 1 2))))
;;; Arithmetic utilities.
(DEFMFUN SQRT1-X^2 (X) (POWER (SUB 1 (POWER X 2)) 1//2))
(DEFMFUN SQRT1+X^2 (X) (POWER (ADD 1 (POWER X 2)) 1//2))
(DEFMFUN SQRTX^2-1 (X) (POWER (ADD (POWER X 2) -1) 1//2))
(DEFMFUN SQ-SUMSQ (X Y) (POWER (ADD (POWER X 2) (POWER Y 2)) 1//2))
(DEFMFUN TRIGP (FUNC) (MEMQ FUNC '(%SIN %COS %TAN %CSC %SEC %COT
%SINH %COSH %TANH %CSCH %SECH %COTH)))
(DEFMFUN ARCP (FUNC) (MEMQ FUNC '(%ASIN %ACOS %ATAN %ACSC %ASEC %ACOT
%ASINH %ACOSH %ATANH %ACSCH %ASECH %ACOTH)))
(DEFPROP %SIN SIMP-%SIN OPERATORS)
(DEFPROP %COS SIMP-%COS OPERATORS)
(DEFPROP %TAN SIMP-%TAN OPERATORS)
(DEFPROP %COT SIMP-%COT OPERATORS)
(DEFPROP %CSC SIMP-%CSC OPERATORS)
(DEFPROP %SEC SIMP-%SEC OPERATORS)
(DEFPROP %SINH SIMP-%SINH OPERATORS)
(DEFPROP %COSH SIMP-%COSH OPERATORS)
(DEFPROP %TANH SIMP-%TANH OPERATORS)
(DEFPROP %COTH SIMP-%COTH OPERATORS)
(DEFPROP %CSCH SIMP-%CSCH OPERATORS)
(DEFPROP %SECH SIMP-%SECH OPERATORS)
(DEFPROP %ASIN SIMP-%ASIN OPERATORS)
(DEFPROP %ACOS SIMP-%ACOS OPERATORS)
(DEFPROP %ATAN SIMP-%ATAN OPERATORS)
(DEFPROP %ACOT SIMP-%ACOT OPERATORS)
(DEFPROP %ACSC SIMP-%ACSC OPERATORS)
(DEFPROP %ASEC SIMP-%ASEC OPERATORS)
(DEFPROP %ASINH SIMP-%ASINH OPERATORS)
(DEFPROP %ACOSH SIMP-%ACOSH OPERATORS)
(DEFPROP %ATANH SIMP-%ATANH OPERATORS)
(DEFPROP %ACOTH SIMP-%ACOTH OPERATORS)
(DEFPROP %ACSCH SIMP-%ACSCH OPERATORS)
(DEFPROP %ASECH SIMP-%ASECH OPERATORS)
(DEFMFUN SIMP-%SIN (FORM Y Z)
(ONEARGCHECK FORM)
(SETQ Y (SIMPCHECK (CADR FORM) Z))
(COND ((OR (FLOATP Y) (AND $NUMER (FIXP Y))) (SIN Y))
(($BFLOATP Y) ($BFLOAT FORM))
((AND $%PIARGS (COND ((ZEROP1 Y) 0) ((LINEARP Y '$%PI) (%PIARGS-SIN\COS Y)))))
((AND $%IARGS (MULTIPLEP Y '$%I)) (MUL '$%I (CONS-EXP '%SINH (COEFF Y '$%I 1))))
((AND $TRIGINVERSES (NOT (ATOM Y))
(COND ((EQ '%ASIN (SETQ Z (CAAR Y))) (CADR Y))
((EQ '%ACOS Z) (SQRT1-X^2 (CADR Y)))
((EQ '%ATAN Z) (DIV (CADR Y) (SQRT1+X^2 (CADR Y))))
((EQ '%ACOT Z) (DIV 1 (SQRT1+X^2 (CADR Y))))
((EQ '%ASEC Z) (DIV (SQRTX^2-1 (CADR Y)) (CADR Y)))
((EQ '%ACSC Z) (DIV 1 (CADR Y)))
((EQ '$ATAN2 Z) (DIV (CADR Y) (SQ-SUMSQ (CADR Y) (CADDR Y)))))))
((AND $TRIGEXPAND (TRIGEXPAND '%SIN Y)))
($EXPONENTIALIZE (EXPONENTIALIZE '%SIN Y))
((AND $HALFANGLES (HALFANGLE '%SIN Y)))
((AND $TRIGSIGN (MMINUSP* Y)) (NEG (CONS-EXP '%SIN (NEG Y))))
(T (EQTEST (LIST '(%SIN) Y) FORM))))
(DEFMFUN SIMP-%COS (FORM Y Z)
(ONEARGCHECK FORM)
(SETQ Y (SIMPCHECK (CADR FORM) Z))
(COND ((OR (FLOATP Y) (AND $NUMER (FIXP Y))) (COS Y))
(($BFLOATP Y) ($BFLOAT FORM))
((AND $%PIARGS (COND ((ZEROP1 Y) 1) ((LINEARP Y '$%PI) (%PIARGS-SIN\COS (ADD %PI//2 Y))))))
((AND $%IARGS (MULTIPLEP Y '$%I)) (CONS-EXP '%COSH (COEFF Y '$%I 1)))
((AND $TRIGINVERSES (NOT (ATOM Y))
(COND ((EQ '%ACOS (SETQ Z (CAAR Y))) (CADR Y))
((EQ '%ASIN Z) (SQRT1-X^2 (CADR Y)))
((EQ '%ATAN Z) (DIV 1 (SQRT1+X^2 (CADR Y))))
((EQ '%ACOT Z) (DIV (CADR Y) (SQRT1+X^2 (CADR Y))))
((EQ '%ASEC Z) (DIV 1 (CADR Y)))
((EQ '%ACSC Z) (DIV (SQRTX^2-1 (CADR Y)) (CADR Y)))
((EQ '$ATAN2 Z) (DIV (CADDR Y) (SQ-SUMSQ (CADR Y) (CADDR Y)))))))
((AND $TRIGEXPAND (TRIGEXPAND '%COS Y)))
($EXPONENTIALIZE (EXPONENTIALIZE '%COS Y))
((AND $HALFANGLES (HALFANGLE '%COS Y)))
((AND $TRIGSIGN (MMINUSP* Y)) (CONS-EXP '%COS (NEG Y)))
(T (EQTEST (LIST '(%COS) Y) FORM))))
(DEFUN %PIARGS-SIN\COS (X)
(LET ($FLOAT COEFF RATCOEFF REM)
(SETQ RATCOEFF (COEFFICIENT X '$%PI 1)
COEFF (LINEARIZE RATCOEFF) REM (COEFFICIENT X '$%PI 0))
(COND ((ZEROP1 REM) (%PIARGS COEFF RATCOEFF))
((NOT (MEVENP (CAR COEFF))) NIL)
((EQUAL 0 (SETQ X (MMOD (CDR COEFF) 2))) (CONS-EXP '%SIN REM))
((EQUAL 1 X) (NEG (CONS-EXP '%SIN REM)))
((ALIKE1 1//2 X) (CONS-EXP '%COS REM))
((ALIKE1 '((RAT) 3 2) X) (NEG (CONS-EXP '%COS REM))))))
(DEFMFUN SIMP-%TAN (FORM Y Z)
(ONEARGCHECK FORM)
(SETQ Y (SIMPCHECK (CADR FORM) Z))
(COND ((OR (FLOATP Y) (AND $NUMER (FIXP Y))) (TAN Y))
(($BFLOATP Y) ($BFLOAT FORM))
((AND $%PIARGS (COND ((ZEROP1 Y) 0) ((LINEARP Y '$%PI) (%PIARGS-TAN\COT Y)))))
((AND $%IARGS (MULTIPLEP Y '$%I)) (MUL '$%I (CONS-EXP '%TANH (COEFF Y '$%I 1))))
((AND $TRIGINVERSES (NOT (ATOM Y))
(COND ((EQ '%ATAN (SETQ Z (CAAR Y))) (CADR Y))
((EQ '%ASIN Z) (DIV (CADR Y) (SQRT1-X^2 (CADR Y))))
((EQ '%ACOS Z) (DIV (SQRT1-X^2 (CADR Y)) (CADR Y)))
((EQ '%ACOT Z) (DIV 1 (CADR Y)))
((EQ '%ASEC Z) (SQRTX^2-1 (CADR Y)))
((EQ '%ACSC Z) (DIV 1 (SQRTX^2-1 (CADR Y))))
((EQ '$ATAN2 Z) (DIV (CADR Y) (CADDR Y))))))
((AND $TRIGEXPAND (TRIGEXPAND '%TAN Y)))
($EXPONENTIALIZE (EXPONENTIALIZE '%TAN Y))
((AND $HALFANGLES (HALFANGLE '%TAN Y)))
((AND $TRIGSIGN (MMINUSP* Y)) (NEG (CONS-EXP '%TAN (NEG Y))))
(T (EQTEST (LIST '(%TAN) Y) FORM))))
(DEFMFUN SIMP-%COT (FORM Y Z)
(ONEARGCHECK FORM)
(SETQ Y (SIMPCHECK (CADR FORM) Z))
(COND ((OR (FLOATP Y) (AND $NUMER (FIXP Y))) (COT Y))
(($BFLOATP Y) ($BFLOAT FORM))
((AND $%PIARGS (COND ((ZEROP1 Y) (DBZ-ERR1 'COT))
((AND (LINEARP Y '$%PI) (SETQ Z (%PIARGS-TAN\COT (ADD %PI//2 Y)))) (NEG Z)))))
((AND $%IARGS (MULTIPLEP Y '$%I)) (MUL -1 '$%I (CONS-EXP '%COTH (COEFF Y '$%I 1))))
((AND $TRIGINVERSES (NOT (ATOM Y))
(COND ((EQ '%ACOT (SETQ Z (CAAR Y))) (CADR Y))
((EQ '%ASIN Z) (DIV (SQRT1-X^2 (CADR Y)) (CADR Y)))
((EQ '%ACOS Z) (DIV (CADR Y) (SQRT1-X^2 (CADR Y))))
((EQ '%ATAN Z) (DIV 1 (CADR Y)))
((EQ '%ASEC Z) (DIV 1 (SQRTX^2-1 (CADR Y))))
((EQ '%ACSC Z) (SQRTX^2-1 (CADR Y)))
((EQ '$ATAN2 Z) (DIV (CADDR Y) (CADR Y))))))
((AND $TRIGEXPAND (TRIGEXPAND '%COT Y)))
($EXPONENTIALIZE (EXPONENTIALIZE '%COT Y))
((AND $HALFANGLES (HALFANGLE '%COT Y)))
((AND $TRIGSIGN (MMINUSP* Y)) (NEG (CONS-EXP '%COT (NEG Y))))
(T (EQTEST (LIST '(%COT) Y) FORM))))
(DEFUN %PIARGS-TAN\COT (X)
(PROG ($FLOAT COEFF REM)
(SETQ COEFF (LINEARIZE (COEFFICIENT X '$%PI 1)) REM (COEFFICIENT X '$%PI 0))
(RETURN (COND ((AND (ZEROP1 REM)
(SETQ REM (%PIARGS COEFF NIL))
(SETQ COEFF (%PIARGS (CONS (CAR COEFF) (RPLUS 1//2 (CDR COEFF)))
NIL)))
(DIV REM COEFF))
((NOT (MEVENP (CAR COEFF))) NIL)
((FIXP (SETQ X (MMOD (CDR COEFF) 2))) (CONS-EXP '%TAN REM))
((OR (ALIKE1 1//2 X) (ALIKE1 '((RAT) 3 2) X)) (NEG (CONS-EXP '%COT REM)))))))
(DEFMFUN SIMP-%CSC (FORM Y Z)
(ONEARGCHECK FORM)
(SETQ Y (SIMPCHECK (CADR FORM) Z))
(COND ((OR (FLOATP Y) (AND $NUMER (FIXP Y))) (CSC Y))
(($BFLOATP Y) ($BFLOAT FORM))
((AND $%PIARGS (COND ((ZEROP1 Y) (DBZ-ERR1 'CSC))
((LINEARP Y '$%PI) (%PIARGS-CSC\SEC Y)))))
((AND $%IARGS (MULTIPLEP Y '$%I)) (MUL -1 '$%I (CONS-EXP '%CSCH (COEFF Y '$%I 1))))
((AND $TRIGINVERSES (NOT (ATOM Y))
(COND ((EQ '%ACSC (SETQ Z (CAAR Y))) (CADR Y))
((EQ '%ASIN Z) (DIV 1 (CADR Y)))
((EQ '%ACOS Z) (DIV 1 (SQRT1-X^2 (CADR Y))))
((EQ '%ATAN Z) (DIV (SQRT1+X^2 (CADR Y)) (CADR Y)))
((EQ '%ACOT Z) (SQRT1+X^2 (CADR Y)))
((EQ '%ASEC Z) (DIV (CADR Y) (SQRTX^2-1 (CADR Y))))
((EQ '$ATAN2 Z) (DIV (SQ-SUMSQ (CADR Y) (CADDR Y)) (CADR Y))))))
((AND $TRIGEXPAND (TRIGEXPAND '%CSC Y)))
($EXPONENTIALIZE (EXPONENTIALIZE '%CSC Y))
((AND $HALFANGLES (HALFANGLE '%CSC Y)))
((AND $TRIGSIGN (MMINUSP* Y)) (NEG (CONS-EXP '%CSC (NEG Y))))
(T (EQTEST (LIST '(%CSC) Y) FORM))))
(DEFMFUN SIMP-%SEC (FORM Y Z)
(ONEARGCHECK FORM)
(SETQ Y (SIMPCHECK (CADR FORM) Z))
(COND ((OR (FLOATP Y) (AND $NUMER (FIXP Y))) (SEC Y))
(($BFLOATP Y) ($BFLOAT FORM))
((AND $%PIARGS (COND ((ZEROP1 Y) 1) ((LINEARP Y '$%PI) (%PIARGS-CSC\SEC (ADD %PI//2 Y))))))
((AND $%IARGS (MULTIPLEP Y '$%I)) (CONS-EXP '%SECH (COEFF Y '$%I 1)))
((AND $TRIGINVERSES (NOT (ATOM Y))
(COND ((EQ '%ASEC (SETQ Z (CAAR Y))) (CADR Y))
((EQ '%ASIN Z) (DIV 1 (SQRT1-X^2 (CADR Y))))
((EQ '%ACOS Z) (DIV 1 (CADR Y)))
((EQ '%ATAN Z) (SQRT1+X^2 (CADR Y)))
((EQ '%ACOT Z) (DIV (SQRT1+X^2 (CADR Y)) (CADR Y)))
((EQ '%ACSC Z) (DIV (CADR Y) (SQRTX^2-1 (CADR Y))))
((EQ '$ATAN2 Z) (DIV (SQ-SUMSQ (CADR Y) (CADDR Y)) (CADDR Y))))))
((AND $TRIGEXPAND (TRIGEXPAND '%SEC Y)))
($EXPONENTIALIZE (EXPONENTIALIZE '%SEC Y))
((AND $HALFANGLES (HALFANGLE '%SEC Y)))
((AND $TRIGSIGN (MMINUSP* Y)) (CONS-EXP '%SEC (NEG Y)))
(T (EQTEST (LIST '(%SEC) Y) FORM))))
(DEFUN %PIARGS-CSC\SEC (X)
(PROG ($FLOAT COEFF REM)
(SETQ COEFF (LINEARIZE (COEFFICIENT X '$%PI 1)) REM (COEFFICIENT X '$%PI 0))
(RETURN (COND ((AND (ZEROP1 REM) (SETQ REM (%PIARGS COEFF NIL))) (DIV 1 REM))
((NOT (MEVENP (CAR COEFF))) NIL)
((EQUAL 0 (SETQ X (MMOD (CDR COEFF) 2))) (CONS-EXP '%CSC REM))
((EQUAL 1 X) (NEG (CONS-EXP '%CSC REM)))
((ALIKE1 1//2 X) (CONS-EXP '%SEC REM))
((ALIKE1 '((RAT) 3 2) X) (NEG (CONS-EXP '%SEC REM)))))))
(DEFMFUN SIMP-%ATAN (FORM Y Z)
(ONEARGCHECK FORM)
(SETQ Y (SIMPCHECK (CADR FORM) Z))
(COND ((OR (FLOATP Y) (AND $NUMER (FIXP Y))) (ATAN1 Y))
(($BFLOATP Y) ($BFLOAT FORM))
((AND $%PIARGS
(COND ((ZEROP1 Y) 0)
((EQUAL Y 1) (SIMPLIFY FOURTH%PI))
((EQUAL Y -1) (NEG (SIMPLIFY FOURTH%PI))))))
((AND $%IARGS (MULTIPLEP Y '$%I))
(MUL '$%I (CONS-EXP '%ATANH (COEFF Y '$%I 1))))
((AND (EQ $TRIGINVERSES '$ALL) (NOT (ATOM Y))
(COND ((EQ (CAAR Y) '%TAN) (CADR Y))
((EQ (CAAR Y) '%COT) (SUB (SIMPLIFY HALF%PI) (CADR Y))))))
($LOGARC (LOGARC '%ATAN Y))
((AND $TRIGSIGN (MMINUSP* Y)) (NEG (CONS-EXP '%ATAN (NEG Y))))
(T (EQTEST (LIST '(%ATAN) Y) FORM))))
(DEFUN %PIARGS (X RATCOEFF)
(COND ((AND (FIXP (CAR X)) (FIXP (CDR X))) 0)
((NOT (MEVENP (CAR X)))
(COND ((NULL RATCOEFF) NIL)
((ALIKE1 (CDR X) '((RAT) 1 2))
(POWER -1 (ADD RATCOEFF -1//2)))))
((OR (ALIKE1 '((RAT) 1 6) (SETQ X (MMOD (CDR X) 2))) (ALIKE1 '((RAT) 5 6) X))
1//2)
((OR (ALIKE1 '((RAT) 1 4) X) (ALIKE1 '((RAT) 3 4) X))
(DIV (POWER 2 1//2) 2))
((OR (ALIKE1 '((RAT) 1 3) X) (ALIKE1 '((RAT) 2 3) X))
(DIV (POWER 3 1//2) 2))
((ALIKE1 1//2 X) 1)
((OR (ALIKE1 '((RAT) 7 6) X) (ALIKE1 '((RAT) 11 6) X)) -1//2)
((OR (ALIKE1 '((RAT) 4 3) X) (ALIKE1 '((RAT) 5 3) X))
(DIV (POWER 3 1//2) -2))
((OR (ALIKE1 '((RAT) 5 4) X) (ALIKE1 '((RAT) 7 4) X))
(MUL -1//2 (POWER 2 1//2)))
((ALIKE1 '((RAT) 3 2) X) -1)))
(DEFUN LINEARIZE (FORM)
(COND ((FIXP FORM) (CONS 0 FORM))
((NUMBERP FORM) NIL)
((ATOM FORM)
(LET (DUM)
(COND ((SETQ DUM (EVOD FORM))
(IF (EQ '$EVEN DUM) '(2 . 0) '(2 . 1)))
((INTEGERP FORM) '(1 . 0)))))
((EQ 'RAT (CAAR FORM)) (CONS 0 FORM))
((EQ 'MPLUS (CAAR FORM)) (LIN-MPLUS FORM))
((EQ 'MTIMES (CAAR FORM)) (LIN-MTIMES FORM))
((EQ 'MEXPT (CAAR FORM)) (LIN-MEXPT FORM))))
(DEFUN LIN-MPLUS (FORM)
(DO ((TL (CDR FORM) (CDR TL)) (DUMMY) (COEFF 0) (REM 0))
((NULL TL) (IF (FIXNUMP COEFF) (CONS COEFF (MMOD REM COEFF))))
(SETQ DUMMY (LINEARIZE (CAR TL)))
(IF (NULL DUMMY)
(RETURN NIL)
(SETQ COEFF (RGCD (CAR DUMMY) COEFF) REM (RPLUS (CDR DUMMY) REM)))))
(DEFUN LIN-MTIMES (FORM)
(DO ((FL (CDR FORM) (CDR FL)) (DUMMY) (COEFF 0) (REM 1))
((NULL FL) (IF (FIXNUMP COEFF) (CONS COEFF (MMOD REM COEFF))))
(SETQ DUMMY (LINEARIZE (CAR FL)))
(IF (NULL DUMMY)
(RETURN NIL)
(SETQ COEFF (RGCD (RTIMES COEFF (CAR DUMMY))
(RGCD (RTIMES COEFF (CDR DUMMY))
(RTIMES REM (CAR DUMMY))))
REM (RTIMES (CDR DUMMY) REM)))))
(DEFUN LIN-MEXPT (FORM)
(LET (DUMMY)
(IF (AND (FIXNUMP (CADDR FORM))
(NOT (MINUSP (CADDR FORM)))
(NOT (NULL (SETQ DUMMY (LINEARIZE (CADR FORM))))))
(CONS (CAR DUMMY) (MMOD (CDR DUMMY) (CADDR FORM))))))
(DEFUN LCM (X Y) (QUOTIENT (TIMES X Y) (GCD X Y)))
(DEFUN RGCD (X Y)
(COND ((FIXP X)
(COND ((FIXP Y) (GCD X Y))
(T (LIST '(RAT) (GCD X (CADR Y)) (CADDR Y)))))
((FIXP Y) (LIST '(RAT) (GCD (CADR X) Y) (CADDR X)))
(T (LIST '(RAT) (GCD (CADR X) (CADR Y)) (LCM (CADDR X) (CADDR Y))))))
(DEFUN REDUCE (X Y)
(PROG (GCD)
(SETQ GCD (GCD X Y) X (QUOTIENT X GCD) Y (QUOTIENT Y GCD))
(IF (MINUSP Y) (SETQ X (MINUS X) Y (MINUS Y)))
(RETURN (IF (EQUAL Y 1) X (LIST '(RAT SIMP) X Y)))))
;; The following four functions are generated in code by TRANSL. - JPG 2/1/81
(DEFMFUN RPLUS (X Y) (ADDK X Y))
(DEFMFUN RDIFFERENCE (X Y) (ADDK X (TIMESK -1 Y)))
(DEFMFUN RTIMES (X Y) (TIMESK X Y))
(DEFMFUN RREMAINDER (X Y)
(COND ((EQUAL 0 Y) (DBZ-ERR))
((FIXP X)
(COND ((FIXP Y) (REDUCE X Y))
(T (REDUCE (TIMES X (CADDR Y)) (CADR Y)))))
((FIXP Y) (REDUCE (CADR X) (TIMES (CADDR X) Y)))
(T (REDUCE (TIMES (CADR X) (CADDR Y)) (TIMES (CADDR X) (CADR Y))))))
(DEFMFUN $EXPONENTIALIZE (EXP)
(LET ($DEMOIVRE)
(COND ((ATOM EXP) EXP)
((TRIGP (CAAR EXP))
(EXPONENTIALIZE (CAAR EXP) ($EXPONENTIALIZE (CADR EXP))))
(T (RECUR-APPLY #'$EXPONENTIALIZE EXP)))))
(DEFMFUN EXPONENTIALIZE (OP ARG)
(COND ((EQ '%SIN OP)
(DIV (SUB (POWER '$%E (MUL '$%I ARG)) (POWER '$%E (MUL -1 '$%I ARG)))
(MUL 2 '$%I)))
((EQ '%COS OP)
(DIV (ADD (POWER '$%E (MUL '$%I ARG)) (POWER '$%E (MUL -1 '$%I ARG))) 2))
((EQ '%TAN OP)
(DIV (SUB (POWER '$%E (MUL '$%I ARG)) (POWER '$%E (MUL -1 '$%I ARG)))
(MUL '$%I (ADD (POWER '$%E (MUL '$%I ARG))
(POWER '$%E (MUL -1 '$%I ARG))))))
((EQ '%COT OP)
(DIV (MUL '$%I (ADD (POWER '$%E (MUL '$%I ARG))
(POWER '$%E (MUL -1 '$%I ARG))))
(SUB (POWER '$%E (MUL '$%I ARG)) (POWER '$%E (MUL -1 '$%I ARG)))))
((EQ '%CSC OP)
(DIV (MUL 2 '$%I)
(SUB (POWER '$%E (MUL '$%I ARG)) (POWER '$%E (MUL -1 '$%I ARG)))))
((EQ '%SEC OP)
(DIV 2 (ADD (POWER '$%E (MUL '$%I ARG)) (POWER '$%E (MUL -1 '$%I ARG)))))
((EQ '%SINH OP)
(DIV (SUB (POWER '$%E ARG) (POWER '$%E (NEG ARG))) 2))
((EQ '%COSH OP)
(DIV (ADD (POWER '$%E ARG) (POWER '$%E (MUL -1 ARG))) 2))
((EQ '%TANH OP)
(DIV (SUB (POWER '$%E ARG) (POWER '$%E (NEG ARG)))
(ADD (POWER '$%E ARG) (POWER '$%E (MUL -1 ARG)))))
((EQ '%COTH OP)
(DIV (ADD (POWER '$%E ARG) (POWER '$%E (MUL -1 ARG)))
(SUB (POWER '$%E ARG) (POWER '$%E (NEG ARG)))))
((EQ '%CSCH OP)
(DIV 2 (SUB (POWER '$%E ARG) (POWER '$%E (NEG ARG)))))
((EQ '%SECH OP)
(DIV 2 (ADD (POWER '$%E ARG) (POWER '$%E (MUL -1 ARG)))))))
(DEFUN COEFFICIENT (EXP VAR POW)
(LET ($NUMER $FLOAT) (COEFF (EXPAND1 EXP 1 0) VAR POW)))
(DEFUN LINEARP (EXP VAR)
(LET ($NUMER $FLOAT)
(AND (SETQ EXP (ISLINEAR (EXPAND1 EXP 1 0) VAR))
(NOT (EQUAL (CAR EXP) 0)))))
(DEFUN MMOD (X MOD)
(COND ((FIXNUMP X)
(IF (MINUSP (SETQ X (- X (* MOD (// X MOD))))) (+ X MOD) X))
((RATNUMP X)
(LIST '(RAT) (MMOD (CADR X) (* MOD (CADDR X))) (CADDR X)))))
(DEFUN MULTIPLEP (EXP VAR)
(AND (NOT (ZEROP1 EXP)) (ZEROP1 (SUB EXP (MUL VAR (COEFF EXP VAR 1))))))
(DEFMFUN MMINUSP (X) (= -1 (SIGNUM1 X)))
(DEFMFUN MMINUSP* (X) (MMINUSP X)) ;; This could be done by a macro in
;; LIBMAX;MAXMAC . - JPG
;; The following definition for MMINUSP* was used experimentally to test
;; for e.g. SIN(-X) -> -SIN(X) using the Macsyma database. However, this
;; approach was found to be very slow in many cases. Instead the syntactic
;; check offered by MMINUSP should be quite sufficient. - JPG
;;(DEFMFUN MMINUSP* (X)
;; (LET (SIGN)
;; (SETQ SIGN (CSIGN X))
;; (OR (MEMQ SIGN '($NEG $NZ))
;; (AND (MMINUSP X) (NOT (MEMQ SIGN '($POS $PZ)))))))
(DEFUN DBZ-ERR ()
(IF (NOT ERRORSW) (MERROR "Division by zero") (*THROW 'ERRORSW T)))
(DEFUN DBZ-ERR1 (FUNC)
(IF (NOT ERRORSW) (MERROR "Division by zero in ~A function" FUNC)
(*THROW 'ERRORSW T)))
;; Only used by LAP code right now.
#+PDP10
(DEFUN NUMERIC-ERR (X MSG) (MERROR "~A in ~A function" MSG X))
;; Trig, hyperbolic functions, and inverses, which take real floating args
;; and return real args. Checks made for overflow and out of range args.
;; The following are read-time constants.
;; This seems bogus. Probably want (FSC (LSH 1 26.) 0) for the PDP10. -cwh
#.(SETQ EPS #+PDP10 (FSC 1.0 -26.)
#+LispM (ASH 1.0 #+3600 -24. #-3600 -31.)
#-(or PDP10 LispM) 1.4E-8)
#.(SETQ PI (ATAN 0.0 -1.0) PIBY2 (//$ PI 2.0))
;; This function is in LAP for PDP10 systems. On the Lisp Machine and
;; in NIL, this should CONDITION-BIND the appropriate arithmetic overflow
;; signals and do whatever NUMERIC-ERR or DBZ-ERR does. Fix later.
#-(OR PDP10 LISPM) (DEFMACRO T//$ (X Y FUNCTION) FUNCTION ;Ignored
`(//$ ,X ,Y))
#+LISPM
(DEFMACRO T//$ (X Y FUNCTION)
(IF (EQUAL Y 0.0)
;; DEFEAT INCOMPETENTLY DONE COMPILER:OPTIMIZATION.
`(T//$-FOO ,X ,Y ,FUNCTION)
`(//$ ,X ,Y)))
#+LISPM
(DEFUN T//$-FOO (X Y FUNCTION) FUNCTION
(//$ X Y))
#+PDP10 (LAP-A-LIST '(
(LAP T//$ SUBR)
(ARGS T//$ (NIL . 3))
(PUSH P (% 0 0 FLOAT1))
(JRST 2 @ (% 0 0 NEXTA))
NEXTA (MOVE TT 0 A)
(FDVR TT 0 B) ;DIVIDE TT BY SECOND ARG
(JFCL 10 UFLOW)
ANS (POPJ P)
UFLOW (MOVE A C)
(SKIPN 0 0 B)
(JCALL 1 'DBZ-ERR1)
(MOVEI B 'OVERFLOW)
(JSP T NEXTB)
NEXTB (TLNN T 64.)
(JCALL 2 'NUMERIC-ERR)
(MOVEI B 'UNDERFLOW)
(SKIPN 0 (SPECIAL ZUNDERFLOW))
(JCALL 2 'NUMERIC-ERR)
(MOVEI TT 0)
(JRST 0 ANS)
NIL ))
;; Numeric functions (SIN, COS, LOG, EXP are built in to Lisp).
(DEFMFUN TAN (X) (T//$ (SIN X) (COS X) 'TAN))
(DEFMFUN COT (X) (T//$ (COS X) (SIN X) 'COT))
(DEFMFUN SEC (X) (T//$ 1.0 (COS X) 'SEC))
(DEFMFUN CSC (X) (T//$ 1.0 (SIN X) 'CSC))
;; #.<form> means to evaluate <form> at read-time.
(DECLARE (FLONUM YY YFLO))
;; We don't use the built-in Franz definitions of ASIN and ACOS because
;; they obviously don't know about LOGARC. - JPG
(DEFMFUN ASIN (NUM)
(LET ((YFLO (FLOAT NUM)))
(COND ((> (ABS YFLO) 1.0) (LOGARC '%ASIN YFLO))
((< (ABS YFLO) #.(SQRT EPS)) YFLO)
(T (*$ (ATAN (ABS YFLO) (SQRT (-$ 1.0 (*$ YFLO YFLO))))
(IF (< YFLO 0.0) -1.0 1.0))))))
(DEFMFUN ACOS (NUM)
(LET ((YFLO (FLOAT NUM)))
(COND ((> (ABS YFLO) 1.0) (LOGARC '%ACOS YFLO))
((< (ABS YFLO) #.(SQRT EPS)) (-$ #.PIBY2 YFLO))
(T (ATAN (SQRT (-$ 1.0 (*$ YFLO YFLO))) YFLO)))))
#-LispM
(DEFMFUN ATAN2 (Y X)
(LET ((YFLO (ATAN (ABS Y) X))) (IF (MINUSP Y) (-$ YFLO) YFLO)))
(DEFMFUN ATAN1 (NUM)
(LET ((YFLO (FLOAT NUM)))
(*$ (ATAN (ABS YFLO) 1.0) (IF (MINUSP YFLO) -1.0 1.0))))
(DEFMFUN ACOT (NUM)
(LET ((YFLO (FLOAT NUM)))
(*$ (ATAN 1.0 (ABS YFLO)) (IF (MINUSP YFLO) -1.0 1.0))))
(DEFMFUN ASEC (NUM)
(LET ((YFLO (FLOAT NUM)))
(IF (< (ABS YFLO) 1.0) (LOGARC '%ASEC YFLO)) (ACOS (//$ YFLO))))
(DEFMFUN ACSC (NUM)
(LET ((YFLO (FLOAT NUM)))
(IF (< (ABS YFLO) 1.0) (LOGARC '%ACSC YFLO)) (ASIN (//$ YFLO))))
(DEFMFUN SINH (NUM)
(LET ((YY (FLOAT NUM)) (YFLO 0.0))
(COND ((< (ABS YY) #.(SQRT EPS)) YY)
(T (SETQ YFLO (EXP (ABS YY)) YFLO (//$ (-$ YFLO (//$ YFLO)) 2.0))
(IF (< YY 0.0) (-$ YFLO) YFLO)))))
(DEFMFUN COSH (NUM)
(LET ((YFLO (FLOAT NUM)))
(SETQ YFLO (EXP (ABS YFLO))) (//$ (+$ YFLO (//$ YFLO)) 2.0)))
#-Lispm
(DEFMFUN TANH (NUM)
(LET ((YY (FLOAT NUM)) (YFLO 0.0))
(COND ((< (ABS YY) #.(SQRT EPS)) YY)
(T (SETQ YFLO (EXP (*$ -2.0 (ABS YY)))
YFLO (//$ (1-$ YFLO) (1+$ YFLO)))
(IF (PLUSP YY) (-$ YFLO) YFLO)))))
#+Lispm
(DEFMFUN TANH (NUM)
(LET ((YY (FLOAT NUM)) (YFLO 0.0))
(COND ((< (ABS YY) #.(SQRT EPS)) YY)
(T (LET ((ANSWER 0.0))
(SETQ ANSWER
(COND ((> (ABS YY) #.(//$ (-$ (LOG EPS)) 2.0)) -1.0)
(T (SETQ YFLO (EXP (*$ -2.0 (ABS YY)))
ANSWER (//$ (1-$ YFLO) (1+$ YFLO))))))
(IF (PLUSP YY) (-$ ANSWER) ANSWER))))))
(DEFMFUN COTH (NUM)
(LET ((YY (FLOAT NUM)) (YFLO 0.0))
(COND ((< (ABS YY) #.(SQRT EPS)) (T//$ 1.0 YY 'COTH))
(T (SETQ YFLO (EXP (*$ -2.0 (ABS YY)))
YFLO (T//$ (1+$ YFLO) (1-$ YFLO) 'COTH))
(IF (PLUSP YY) (-$ YFLO) YFLO)))))
(DEFMFUN CSCH (NUM)
(LET ((YY (FLOAT NUM)) (YFLO 0.0))
(COND ((< (ABS YY) #.(SQRT EPS)) (//$ YY))
(T (SETQ YFLO (EXP (-$ (ABS YY)))
YFLO (T//$ (*$ 2.0 YFLO)
(1-$ (IF (< YFLO #.(SQRT EPS)) 0.0 (*$ YFLO YFLO))) 'CSCH))
(IF (PLUSP YY) (-$ YFLO) YFLO)))))
(DEFMFUN SECH (NUM)
(LET ((YFLO (FLOAT NUM))) (SETQ YFLO (EXP (-$ (ABS YFLO))))
(//$ YFLO 0.5 (1+$ (IF (< YFLO #.(SQRT EPS)) 0.0 (*$ YFLO YFLO))))))
(DEFMFUN ACOSH (NUM)
(LET ((YFLO (FLOAT NUM)))
(COND ((< YFLO 1.0) (LOGARC '%ACOSH YFLO))
((> YFLO #.(SQRT (//$ EPS))) (LOG (*$ 2.0 YFLO)))
(T (LOG (+$ (SQRT (1-$ (*$ YFLO YFLO))) YFLO))))))
(DEFMFUN ASINH (NUM)
(LET* ((YY (FLOAT NUM))
(YFLO (ABS YY)))
(COND ((< YFLO #.(SQRT EPS)) YFLO)
(T (SETQ YFLO (LOG (COND ((> YFLO #.(SQRT (//$ EPS))) (*$ 2.0 YFLO))
(T (+$ (SQRT (1+$ (*$ YFLO YFLO))) YFLO)))))
(COND ((MINUSP YY) (-$ YFLO)) (T YFLO))))))
(DEFMFUN ATANH (NUM)
(LET ((YFLO (FLOAT NUM)))
(COND ((< (ABS YFLO) #.(SQRT EPS)) YFLO)
((< (ABS YFLO) 1.0) (//$ (LOG (T//$ (1+$ YFLO) (-$ 1.0 YFLO) 'ATANH)) 2.0))
((= 1.0 (ABS YFLO)) (T//$ 1.0 0.0 'ATANH))
(T (LOGARC '%ATANH YFLO)))))
(DEFMFUN ACOTH (NUM)
(LET ((YFLO (FLOAT NUM)))
(COND ((> (ABS YFLO) 1.0) (//$ (LOG (//$ (-$ 1.0 YFLO) (1+$ YFLO))) 2.0))
((= 1.0 (ABS YFLO)) (T//$ 1.0 0.0 'ACOTH))
(T (LOGARC '%ACOTH YFLO)))))
(DEFMFUN ASECH (NUM)
(LET ((YFLO (FLOAT NUM)))
(COND ((OR (MINUSP YFLO) (> YFLO 1.0)) (LOGARC '%ASECH YFLO)))
(ACOSH (T//$ 1.0 YFLO 'ASECH))))
(DEFMFUN ACSCH (NUM) (ASINH (T//$ 1.0 (FLOAT NUM) 'ACSCH)))

378
src/mrg/trigo.333 Normal file
View File

@@ -0,0 +1,378 @@
;;;;;;;;;;;;;;;;;;; -*- Mode: Lisp; Package: Macsyma -*- ;;;;;;;;;;;;;;;;;;;
;;; (c) Copyright 1982 Massachusetts Institute of Technology ;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(macsyma-module trigo)
(LOAD-MACSYMA-MACROS MRGMAC)
(DECLARE (GENPREFIX TRI)
(SPECIAL VARLIST ERRORSW)
(FLONUM (TAN) (COT) (SEC) (CSC)
(ATAN2) (ATAN1) (ACOT)
(SINH) (COSH) (TANH) (COTH) (CSCH) (SECH)
(ASINH) (ACSCH)
(T//$ FLONUM FLONUM NOTYPE))
(*EXPR $BFLOAT TEVAL SIGNUM1 ZEROP1 ISLINEAR
TIMESK ADDK INTEGERP EVOD LOGARC MEVENP HALFANGLE COEFF))
(DECLARE (SPLITFILE HYPER))
(DEFMFUN SIMP-%SINH (FORM Y Z)
(ONEARGCHECK FORM)
(SETQ Y (SIMPCHECK (CADR FORM) Z))
(COND ((OR (FLOATP Y) (AND $NUMER (FIXP Y))) (SINH Y))
(($BFLOATP Y) ($BFLOAT FORM))
((AND $%PIARGS (IF (ZEROP1 Y) 0)))
((AND $%IARGS (MULTIPLEP Y '$%I)) (MUL '$%I (CONS-EXP '%SIN (COEFF Y '$%I 1))))
((AND $TRIGINVERSES (NOT (ATOM Y)) (IF (EQ '%ASINH (CAAR Y)) (CADR Y))))
((AND $TRIGEXPAND (TRIGEXPAND '%SINH Y)))
($EXPONENTIALIZE (EXPONENTIALIZE '%SINH Y))
((AND $HALFANGLES (HALFANGLE '%SINH Y)))
((AND $TRIGSIGN (MMINUSP* Y)) (NEG (CONS-EXP '%SINH (NEG Y))))
(T (EQTEST (LIST '(%SINH) Y) FORM))))
(DEFMFUN SIMP-%COSH (FORM Y Z)
(ONEARGCHECK FORM)
(SETQ Y (SIMPCHECK (CADR FORM) Z))
(COND ((OR (FLOATP Y) (AND $NUMER (FIXP Y))) (COSH Y))
(($BFLOATP Y) ($BFLOAT FORM))
((AND $%PIARGS (IF (ZEROP1 Y) 1)))
((AND $%IARGS (MULTIPLEP Y '$%I)) (CONS-EXP '%COS (COEFF Y '$%I 1)))
((AND $TRIGINVERSES (NOT (ATOM Y)) (IF (EQ '%ACOSH (CAAR Y)) (CADR Y))))
((AND $TRIGEXPAND (TRIGEXPAND '%COSH Y)))
($EXPONENTIALIZE (EXPONENTIALIZE '%COSH Y))
((AND $HALFANGLES (HALFANGLE '%COSH Y)))
((AND $TRIGSIGN (MMINUSP* Y)) (CONS-EXP '%COSH (NEG Y)))
(T (EQTEST (LIST '(%COSH) Y) FORM))))
(DEFMFUN SIMP-%TANH (FORM Y Z)
(ONEARGCHECK FORM)
(SETQ Y (SIMPCHECK (CADR FORM) Z))
(COND ((OR (FLOATP Y) (AND $NUMER (FIXP Y))) (TANH Y))
(($BFLOATP Y) ($BFLOAT FORM))
((AND $%PIARGS (IF (ZEROP1 Y) 0)))
((AND $%IARGS (MULTIPLEP Y '$%I)) (MUL '$%I (CONS-EXP '%TAN (COEFF Y '$%I 1))))
((AND $TRIGINVERSES (NOT (ATOM Y)) (IF (EQ '%ATANH (SETQ Z (CAAR Y))) (CADR Y))))
((AND $TRIGEXPAND (TRIGEXPAND '%TANH Y)))
($EXPONENTIALIZE (EXPONENTIALIZE '%TANH Y))
((AND $HALFANGLES (HALFANGLE '%TANH Y)))
((AND $TRIGSIGN (MMINUSP* Y)) (NEG (CONS-EXP '%TANH (NEG Y))))
(T (EQTEST (LIST '(%TANH) Y) FORM))))
(DEFMFUN SIMP-%COTH (FORM Y Z)
(ONEARGCHECK FORM)
(SETQ Y (SIMPCHECK (CADR FORM) Z))
(COND ((OR (FLOATP Y) (AND $NUMER (FIXP Y))) (COTH Y))
(($BFLOATP Y) ($BFLOAT FORM))
((AND $%PIARGS (IF (ZEROP1 Y) (DBZ-ERR1 'COTH))))
((AND $%IARGS (MULTIPLEP Y '$%I)) (MUL -1 '$%I (CONS-EXP '%COTH (COEFF Y '$%I 1))))
((AND $TRIGINVERSES (NOT (ATOM Y)) (IF (EQ '%ACOTH (CAAR Y)) (CADR Y))))
((AND $TRIGEXPAND (TRIGEXPAND '%COTH Y)))
($EXPONENTIALIZE (EXPONENTIALIZE '%COTH Y))
((AND $HALFANGLES (HALFANGLE '%COTH Y)))
((AND $TRIGSIGN (MMINUSP* Y)) (NEG (CONS-EXP '%COTH (NEG Y))))
(T (EQTEST (LIST '(%COTH) Y) FORM))))
(DEFMFUN SIMP-%CSCH (FORM Y Z)
(ONEARGCHECK FORM)
(SETQ Y (SIMPCHECK (CADR FORM) Z))
(COND ((OR (FLOATP Y) (AND $NUMER (FIXP Y))) (CSCH Y))
(($BFLOATP Y) ($BFLOAT FORM))
((AND $%PIARGS (COND ((ZEROP1 Y) (DBZ-ERR1 'CSCH)))))
((AND $%IARGS (MULTIPLEP Y '$%I)) (MUL -1 '$%I (CONS-EXP '%CSC (COEFF Y '$%I 1))))
((AND $TRIGINVERSES (NOT (ATOM Y)) (IF (EQ '%ACSCH (CAAR Y)) (CADR Y))))
((AND $TRIGEXPAND (TRIGEXPAND '%CSCH Y)))
($EXPONENTIALIZE (EXPONENTIALIZE '%CSCH Y))
((AND $HALFANGLES (HALFANGLE '%CSCH Y)))
((AND $TRIGSIGN (MMINUSP* Y)) (NEG (CONS-EXP '%CSCH (NEG Y))))
(T (EQTEST (LIST '(%CSCH) Y) FORM))))
(DEFMFUN SIMP-%SECH (FORM Y Z)
(ONEARGCHECK FORM)
(SETQ Y (SIMPCHECK (CADR FORM) Z))
(COND ((OR (FLOATP Y) (AND $NUMER (FIXP Y))) (SECH Y))
(($BFLOATP Y) ($BFLOAT FORM))
((AND $%PIARGS (ZEROP1 Y)) 1)
((AND $%IARGS (MULTIPLEP Y '$%I)) (CONS-EXP '%SEC (COEFF Y '$%I 1)))
((AND $TRIGINVERSES (NOT (ATOM Y)) (IF (EQ '%ASECH (CAAR Y)) (CADR Y))))
((AND $TRIGEXPAND (TRIGEXPAND '%SECH Y)))
($EXPONENTIALIZE (EXPONENTIALIZE '%SECH Y))
((AND $HALFANGLES (HALFANGLE '%SECH Y)))
((AND $TRIGSIGN (MMINUSP* Y)) (CONS-EXP '%SECH (NEG Y)))
(T (EQTEST (LIST '(%SECH) Y) FORM))))
(DECLARE (SPLITFILE ATRIG))
(DEFMFUN SIMP-%ASIN (FORM Y Z)
(ONEARGCHECK FORM)
(SETQ Y (SIMPCHECK (CADR FORM) Z))
(COND ((OR (FLOATP Y) (AND $NUMER (FIXP Y))) (ASIN Y))
(($BFLOATP Y) ($BFLOAT FORM))
((AND $%PIARGS
(COND ((ZEROP1 Y) 0) ((EQUAL 1 Y) %PI//2) ((EQUAL -1 Y) (NEG %PI//2))
((ALIKE1 Y 1//2) (MUL '((RAT SIMP) 1 6) '$%PI)))))
((AND $%IARGS (MULTIPLEP Y '$%I)) (MUL '$%I (CONS-EXP '%ASINH (COEFF Y '$%I 1))))
((AND (EQ $TRIGINVERSES '$ALL) (NOT (ATOM Y)) (IF (EQ '%SIN (CAAR Y)) (CADR Y))))
($LOGARC (LOGARC '%ASIN Y))
((AND $TRIGSIGN (MMINUSP* Y)) (NEG (CONS-EXP '%ASIN (NEG Y))))
(T (EQTEST (LIST '(%ASIN) Y) FORM))))
(DEFMFUN SIMP-%ACOS (FORM Y Z)
(ONEARGCHECK FORM)
(SETQ Y (SIMPCHECK (CADR FORM) Z))
(COND ((OR (FLOATP Y) (AND $NUMER (FIXP Y))) (ACOS Y))
(($BFLOATP Y) ($BFLOAT FORM))
((AND $%PIARGS
(COND ((ZEROP1 Y) %PI//2) ((EQUAL 1 Y) 0) ((EQUAL -1 Y) '$%PI)
((ALIKE1 Y 1//2) (MUL '((RAT SIMP) 1 3) '$%PI)))))
((AND (EQ $TRIGINVERSES '$ALL) (NOT (ATOM Y))
(IF (EQ '%COS (CAAR Y)) (CADR Y))))
($LOGARC (LOGARC '%ACOS Y))
((AND $TRIGSIGN (MMINUSP* Y)) (SUB '$%PI (CONS-EXP '%ACOS (NEG Y))))
(T (EQTEST (LIST '(%ACOS) Y) FORM))))
(DEFMFUN SIMP-%ACOT (FORM Y Z)
(ONEARGCHECK FORM)
(SETQ Y (SIMPCHECK (CADR FORM) Z))
(COND ((OR (FLOATP Y) (AND $NUMER (FIXP Y))) (ACOT Y))
(($BFLOATP Y) ($BFLOAT FORM))
((AND $%PIARGS
(COND ((ZEROP1 Y) %PI//2) ((EQUAL 1 Y) %PI//4) ((EQUAL -1 Y) (NEG %PI//4)))))
((AND $%IARGS (MULTIPLEP Y '$%I)) (MUL -1 '$%I (CONS-EXP '%ACOTH (COEFF Y '$%I 1))))
((AND (EQ $TRIGINVERSES '$ALL) (NOT (ATOM Y))
(IF (EQ '%COT (CAAR Y)) (CADR Y))))
($LOGARC (LOGARC '%ACOT Y))
((AND $TRIGSIGN (MMINUSP* Y)) (NEG (CONS-EXP '%ACOT (NEG Y))))
(T (EQTEST (LIST '(%ACOT) Y) FORM))))
(DEFMFUN SIMP-%ACSC (FORM Y Z)
(ONEARGCHECK FORM)
(SETQ Y (SIMPCHECK (CADR FORM) Z))
(COND ((OR (FLOATP Y) (AND $NUMER (FIXP Y))) (ACSC Y))
(($BFLOATP Y) ($BFLOAT FORM))
((AND $%PIARGS
(COND ((EQUAL 1 Y) %PI//2) ((EQUAL -1 Y) (NEG %PI//2)))))
((AND $%IARGS (MULTIPLEP Y '$%I)) (MUL -1 '$%I (CONS-EXP '%ACSCH (COEFF Y '$%I 1))))
((AND (EQ $TRIGINVERSES '$ALL) (NOT (ATOM Y))
(IF (EQ '%CSC (CAAR Y)) (CADR Y))))
($LOGARC (LOGARC '%ACSC Y))
((AND $TRIGSIGN (MMINUSP* Y)) (NEG (CONS-EXP '%ACSC (NEG Y))))
(T (EQTEST (LIST '(%ACSC) Y) FORM))))
(DEFMFUN SIMP-%ASEC (FORM Y Z)
(ONEARGCHECK FORM)
(SETQ Y (SIMPCHECK (CADR FORM) Z))
(COND ((OR (FLOATP Y) (AND $NUMER (FIXP Y))) (ASEC Y))
(($BFLOATP Y) ($BFLOAT FORM))
((AND $%PIARGS
(COND ((EQUAL 1 Y) 0) ((EQUAL -1 Y) '$%PI))))
((AND (EQ $TRIGINVERSES '$ALL) (NOT (ATOM Y))
(IF (EQ '%SEC (CAAR Y)) (CADR Y))))
($LOGARC (LOGARC '%ASEC Y))
((AND $TRIGSIGN (MMINUSP* Y)) (SUB '$%PI (CONS-EXP '%ASEC (NEG Y))))
(T (EQTEST (LIST '(%ASEC) Y) FORM))))
(DECLARE (SPLITFILE AHYPER))
(DEFMFUN SIMP-%ASINH (FORM Y Z)
(ONEARGCHECK FORM)
(SETQ Y (SIMPCHECK (CADR FORM) Z))
(COND ((OR (FLOATP Y) (AND $NUMER (FIXP Y))) (ASINH Y))
(($BFLOATP Y) ($BFLOAT FORM))
((AND $%PIARGS (IF (ZEROP1 Y) Y)))
((AND $%IARGS (MULTIPLEP Y '$%I)) (MUL '$%I (CONS-EXP '%ASIN (COEFF Y '$%I 1))))
((AND (EQ $TRIGINVERSES '$ALL) (NOT (ATOM Y))
(IF (EQ '%SINH (CAAR Y)) (CADR Y))))
($LOGARC (LOGARC '%ASINH Y))
((AND $TRIGSIGN (MMINUSP* Y)) (NEG (CONS-EXP '%ASINH (NEG Y))))
(T (EQTEST (LIST '(%ASINH) Y) FORM))))
(DEFMFUN SIMP-%ACOSH (FORM Y Z)
(ONEARGCHECK FORM)
(SETQ Y (SIMPCHECK (CADR FORM) Z))
(COND ((OR (FLOATP Y) (AND $NUMER (FIXP Y))) (ACOSH Y))
(($BFLOATP Y) ($BFLOAT FORM))
((AND $%PIARGS (IF (EQUAL Y 1) 0)))
((AND (EQ $TRIGINVERSES '$ALL) (NOT (ATOM Y))
(IF (EQ '%COSH (CAAR Y)) (CADR Y))))
($LOGARC (LOGARC '%ACOSH Y))
(T (EQTEST (LIST '(%ACOSH) Y) FORM))))
(DEFMFUN SIMP-%ATANH (FORM Y Z)
(ONEARGCHECK FORM)
(SETQ Y (SIMPCHECK (CADR FORM) Z))
(COND ((OR (FLOATP Y) (AND $NUMER (FIXP Y))) (ATANH Y))
(($BFLOATP Y) ($BFLOAT FORM))
((AND $%PIARGS (COND ((ZEROP1 Y) 0)
((OR (EQUAL Y 1) (EQUAL Y -1)) (DBZ-ERR1 'ATANH)))))
((AND $%IARGS (MULTIPLEP Y '$%I)) (MUL '$%I (CONS-EXP '%ATAN (COEFF Y '$%I 1))))
((AND (EQ $TRIGINVERSES '$ALL) (NOT (ATOM Y))
(IF (EQ '%TANH (CAAR Y)) (CADR Y))))
($LOGARC (LOGARC '%ATANH Y))
((AND $TRIGSIGN (MMINUSP* Y)) (NEG (CONS-EXP '%ATANH (NEG Y))))
(T (EQTEST (LIST '(%ATANH) Y) FORM))))
(DEFMFUN SIMP-%ACOTH (FORM Y Z)
(ONEARGCHECK FORM)
(SETQ Y (SIMPCHECK (CADR FORM) Z))
(COND ((OR (FLOATP Y) (AND $NUMER (FIXP Y))) (ACOTH Y))
(($BFLOATP Y) ($BFLOAT FORM))
((AND $%PIARGS (IF (OR (EQUAL Y 1) (EQUAL Y -1)) (DBZ-ERR1 'ACOTH))))
((AND $%IARGS (MULTIPLEP Y '$%I)) (MUL -1 '$%I (CONS-EXP '%ACOT (COEFF Y '$%I 1))))
((AND (EQ $TRIGINVERSES '$ALL) (NOT (ATOM Y))
(IF (EQ '%COTH (CAAR Y)) (CADR Y))))
($LOGARC (LOGARC '%ACOTH Y))
((AND $TRIGSIGN (MMINUSP* Y)) (NEG (CONS-EXP '%ACOTH (NEG Y))))
(T (EQTEST (LIST '(%ACOTH) Y) FORM))))
(DEFMFUN SIMP-%ACSCH (FORM Y Z)
(ONEARGCHECK FORM)
(SETQ Y (SIMPCHECK (CADR FORM) Z))
(COND ((OR (FLOATP Y) (AND $NUMER (FIXP Y))) (ACSCH Y))
(($BFLOATP Y) ($BFLOAT FORM))
((AND $%PIARGS (IF (ZEROP1 Y) (DBZ-ERR1 'ACSCH))))
((AND $%IARGS (MULTIPLEP Y '$%I)) (MUL -1 '$%I (CONS-EXP '%ACSC (COEFF Y '$%I 1))))
((AND (EQ $TRIGINVERSES '$ALL) (NOT (ATOM Y))
(IF (EQ '%CSCH (CAAR Y)) (CADR Y))))
($LOGARC (LOGARC '%ACSCH Y))
((AND $TRIGSIGN (MMINUSP* Y)) (NEG (CONS-EXP '%ACSCH (NEG Y))))
(T (EQTEST (LIST '(%ACSCH) Y) FORM))))
(DEFMFUN SIMP-%ASECH (FORM Y Z)
(ONEARGCHECK FORM)
(SETQ Y (SIMPCHECK (CADR FORM) Z))
(COND ((OR (FLOATP Y) (AND $NUMER (FIXP Y))) (ASECH Y))
(($BFLOATP Y) ($BFLOAT FORM))
((AND $%PIARGS (COND ((EQUAL Y 1) 0)
((ZEROP1 Y) (DBZ-ERR1 'ASECH)))))
((AND (EQ $TRIGINVERSES '$ALL) (NOT (ATOM Y))
(IF (EQ '%SECH (CAAR Y)) (CADR Y))))
($LOGARC (LOGARC '%ASECH Y))
((AND $TRIGSIGN (MMINUSP* Y)) (CONS-EXP '%ASECH (NEG Y)))
(T (EQTEST (LIST '(%ASECH) Y) FORM))))
(DECLARE (SPLITFILE TRIGEX) (SPECIAL $TRIGEXPANDPLUS $TRIGEXPANDTIMES))
(DEFMFUN $TRIGEXPAND (E)
(COND ((ATOM E) E)
((SPECREPP E) ($TRIGEXPAND (SPECDISREP E)))
((TRIGEXPAND (CAAR E) (CADR E)))
(T (RECUR-APPLY #'$TRIGEXPAND E))))
(DEFMFUN TRIGEXPAND (OP ARG)
(COND ((ATOM ARG) NIL)
((AND $TRIGEXPANDPLUS (EQ 'MPLUS (CAAR ARG)))
(COND ((EQ '%SIN OP) (SIN\COS-PLUS (CDR ARG) 1 '%SIN '%COS -1))
((EQ '%COS OP) (SIN\COS-PLUS (CDR ARG) 0 '%SIN '%COS -1))
((EQ '%TAN OP) (TAN-PLUS (CDR ARG) '%TAN -1))
((EQ '%COT OP) (COT-PLUS (CDR ARG) '%COT -1))
((EQ '%CSC OP) (CSC\SEC-PLUS (CDR ARG) 1 '%CSC '%SEC -1))
((EQ '%SEC OP) (CSC\SEC-PLUS (CDR ARG) 0 '%CSC '%SEC -1))
((EQ '%SINH OP) (SIN\COS-PLUS (CDR ARG) 1 '%SINH '%COSH 1))
((EQ '%COSH OP) (SIN\COS-PLUS (CDR ARG) 0 '%SINH '%COSH 1))
((EQ '%TANH OP) (TAN-PLUS (CDR ARG) '%TANH 1))
((EQ '%COTH OP) (COT-PLUS (CDR ARG) '%COTH 1))
((EQ '%CSCH OP) (CSC\SEC-PLUS (CDR ARG) 1 '%CSCH '%SECH 1))
((EQ '%SECH OP) (CSC\SEC-PLUS (CDR ARG) 0 '%CSCH '%SECH 1))))
((AND $TRIGEXPANDTIMES (EQ 'MTIMES (CAAR ARG)) (EQ (TYPEP (CADR ARG)) 'FIXNUM))
(COND ((EQ '%SIN OP) (SIN\COS-TIMES (CDDR ARG) 1 (CADR ARG) '%SIN '%COS -1))
((EQ '%COS OP) (SIN\COS-TIMES (CDDR ARG) 0 (CADR ARG) '%SIN '%COS -1))
((EQ '%TAN OP) (TAN-TIMES (CDDR ARG) (CADR ARG) '%TAN -1))
((EQ '%COT OP) (COT-TIMES (CDDR ARG) (CADR ARG) '%COT -1))
((EQ '%CSC OP) (CSC\SEC-TIMES (CDDR ARG) 1 (CADR ARG) '%CSC '%SEC -1))
((EQ '%SEC OP) (CSC\SEC-TIMES (CDDR ARG) 0 (CADR ARG) '%CSC '%SEC -1))
((EQ '%SINH OP) (SIN\COS-TIMES (CDDR ARG) 1 (CADR ARG) '%SINH '%COSH 1))
((EQ '%COSH OP) (SIN\COS-TIMES (CDDR ARG) 0 (CADR ARG) '%SINH '%COSH 1))
((EQ '%TANH OP) (TAN-TIMES (CDDR ARG) (CADR ARG) '%TANH 1))
((EQ '%COTH OP) (COT-TIMES (CDDR ARG) (CADR ARG) '%COTH 1))
((EQ '%CSCH OP) (CSC\SEC-TIMES (CDDR ARG) 1 (CADR ARG) '%CSCH '%SECH 1))
((EQ '%SECH OP) (CSC\SEC-TIMES (CDDR ARG) 0 (CADR ARG) '%CSCH '%SECH 1))))))
(DEFUN SIN\COS-PLUS (L N F1 F2 FLAG)
(DO ((I N (+ 2 I)) (LEN (LENGTH L)) (SIGN 1 (* FLAG SIGN)) (RESULT))
((> I LEN) (SIMPLIFY (CONS '(MPLUS) RESULT)))
(SETQ RESULT (MPC (COND ((MINUSP SIGN) '(-1 (MTIMES))) (T '((MTIMES)))) L RESULT F1 F2 LEN I))))
(DEFUN TAN-PLUS (L F FLAG)
(DO ((I 1 (+ 2 I)) (SIGN 1 (* FLAG SIGN)) (LEN (LENGTH L)) (NUM) (DEN (LIST 1)))
((> I LEN) (DIV* (CONS '(MPLUS) NUM) (CONS '(MPLUS) DEN)))
(SETQ NUM (MPC1 (LIST SIGN '(MTIMES)) L NUM F LEN I)
DEN (COND ((= LEN I) DEN)
(T (MPC1 (LIST (* FLAG SIGN) '(MTIMES)) L DEN F LEN (1+ I)))))))
(DEFUN COT-PLUS (L F FLAG)
(DO ((I (LENGTH L) (- I 2)) (LEN (LENGTH L)) (SIGN 1 (* FLAG SIGN)) (NUM) (DEN))
((< I 0) (DIV* (CONS '(MPLUS) NUM) (CONS '(MPLUS) DEN)))
(SETQ NUM (MPC1 (LIST SIGN '(MTIMES)) L NUM F LEN I)
DEN (COND ((= 0 I) DEN)
(T (MPC1 (LIST SIGN '(MTIMES)) L DEN F LEN (1- I)))))))
(DEFUN CSC\SEC-PLUS (L N F1 F2 FLAG)
(DIV* (DO ((L L (CDR L)) (RESULT)) ((NULL L) (CONS '(MTIMES) RESULT))
(SETQ RESULT (CONS (CONS-EXP F1 (CAR L)) (CONS (CONS-EXP F2 (CAR L)) RESULT))))
(SIN\COS-PLUS L N F1 F2 FLAG)))
(DEFUN SIN\COS-TIMES (L M N F1 F2 FLAG)
;; Assume m,n < 2^17, but Binom may become big
;; Flag is 1 or -1
(SETQ F1 (CONS-EXP F1 (CONS '(MTIMES) L)) F2 (CONS-EXP F2 (CONS '(MTIMES) L)))
(DO ((I M (+ 2 I)) (END (ABS N)) (RESULT)
(BINOM (COND ((= 0 M) 1) (T (ABS N))) (quotient (times (* FLAG (- END I 1) (- END I)) BINOM) (* (+ 2 I) (1+ I)))))
((> I END) (SETQ RESULT (SIMPLIFY (CONS '(MPLUS) RESULT)))
(COND ((AND (= 1 M) (MINUSP N)) (NEG RESULT)) (T RESULT)))
(SETQ RESULT (CONS (MUL BINOM (POWER F1 I) (POWER F2 (- END I))) RESULT))))
(DEFUN TAN-TIMES (L N F FLAG)
(SETQ F (CONS-EXP F (CONS '(MTIMES) L)))
(DO ((I 1 (+ 2 I)) (END (ABS N)) (NUM) (DEN (LIST 1))
(BINOM (ABS N) (quotient (times (- END I 1) BINOM) (+ 2 I))))
((> I END) (SETQ NUM (DIV* (CONS '(MPLUS) NUM) (CONS '(MPLUS) DEN)))
(COND ((MINUSP N) (NEG NUM)) (T NUM)))
(SETQ NUM (CONS (MUL BINOM (POWER F I)) NUM)
DEN (COND ((= END I) DEN)
(T (CONS (MUL (SETQ BINOM (quotient (times (* FLAG (- END I)) BINOM) (1+ I)))
(POWER F (1+ I)))
DEN))))))
(DEFUN COT-TIMES (L N F FLAG)
(SETQ F (CONS-EXP F (CONS '(MTIMES) L)))
(DO ((I (ABS N) (- I 2)) (END (ABS N)) (NUM) (DEN)
(BINOM 1 (quotient (times (* FLAG (1- I)) BINOM) (- END I -2))))
((< I 0) (SETQ NUM (DIV* (CONS '(MPLUS) NUM) (CONS '(MPLUS) DEN)))
(IF (MINUSP N) (NEG NUM) NUM))
(SETQ NUM (CONS (MUL BINOM (POWER F I)) NUM)
DEN (IF (= 0 I) DEN
(CONS (MUL (SETQ BINOM (quotient (times I BINOM) (- END I -1))) (POWER F (1- I))) DEN)))))
(DEFUN CSC\SEC-TIMES (L M N F1 F2 FLAG)
(DIV* (MUL (POWER (CONS-EXP F1 (CONS '(MTIMES) L)) (ABS N))
(POWER (CONS-EXP F2 (CONS '(MTIMES) L)) (ABS N)))
(SIN\COS-TIMES L M N F1 F2 FLAG)))
(DEFUN MPC (DL UL RESULT F1 F2 DI UI)
(COND ((= 0 UI)
(CONS (RECONC DL (MAPCAR #'(LAMBDA (L) (CONS-EXP F2 L)) UL))
RESULT))
((= DI UI)
(CONS (RECONC DL (MAPCAR #'(LAMBDA (L) (CONS-EXP F1 L)) UL))
RESULT))
(T (MPC (CONS (CONS-EXP F1 (CAR UL)) DL) (CDR UL)
(MPC (CONS (CONS-EXP F2 (CAR UL)) DL)
(CDR UL) RESULT F1 F2 (1- DI) UI) F1 F2
(1- DI) (1- UI)))))
(DEFUN MPC1 (DL UL RESULT F DI UI)
(COND ((= 0 UI) (CONS (REVERSE DL) RESULT))
((= DI UI)
(CONS (RECONC DL (MAPCAR #'(LAMBDA (L) (CONS-EXP F L)) UL)) RESULT))
(T (MPC1 (CONS (CONS-EXP F (CAR UL)) DL) (CDR UL)
(MPC1 DL (CDR UL) RESULT F (1- DI) UI) F
(1- DI) (1- UI)))))
;; Local Modes:
;; Mode: LISP
;; Comment Col: 40
;; End: