;;; -*- Mode: Lisp; Package: Maxima; Syntax: Common-Lisp; Base: 10 -*- ;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; The data in this file contains enhancments. ;;;;; ;;; ;;;;; ;;; Copyright (c) 1984,1987 by William Schelter,University of Texas ;;;;; ;;; All rights reserved ;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; (c) Copyright 1980 Massachusetts Institute of Technology ;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; (in-package "MAXIMA") (macsyma-module ratmac macro) ;; Macros for manipulating rational functions. (DEFMACRO PCOEFP (E) `(ATOM ,E)) #-CL (DEFMACRO PZEROP (X) `(SIGNP E ,X)) ;TRUE FOR 0 OR 0.0 ;;;(DEFMACRO PZEROP (X) `(LET ((gg1032 ,X)) (AND (NUMBERP gg1032) (ZEROP gg1032)))) (proclaim '(inline pzerop)) #+CL (defun pzerop (x) (if (fixnump x) (zerop (the fixnum x)) (if (consp x) nil (and (floatp x) (zerop x))))) #+CL (DEFMACRO PZERO () 0) (DEFMACRO PTZEROP (TERMS) `(NULL ,TERMS)) ;for poly terms (DEFMACRO PTZERO () '()) #-CL (DEFMACRO CZEROP (C) `(SIGNP E ,C)) #+CL (defmacro czerop (c) `(pzerop ,c)) (DEFMACRO CMINUS (C) `(MINUS ,C)) (DEFMACRO CMINUSP (C) `(MINUSP ,C)) (DEFMACRO CDERIVATIVE (ign ign1)ign ign1 0) ;; Similar to REMOVE on the Lisp Machine (DEFMACRO DELET (ITEM LLIST) `(ZL-DELETE ,ITEM (COPY-TOP-LEVEL ,LLIST ))) ;; the rational function package uses GENSYM's to represent variables. ;; The PDP-10 implementation used to use the PRINTNAME of the gensym ;; as a place to store a VALUE. Somebody changed this to value-cell instead, ;; even though using the value-cell costs more. Anyway, in NIL I want it ;; to use the property list, as thats a lot cheaper than creating a value ;; cell. Actually, better to use the PACKAGE slot, a kludge is a kludge right? (DEFMACRO VALGET (ITEM) #+NIL `(GET ,ITEM 'GENSYMVAL) #-NIL `(SYMBOL-VALUE ,ITEM)) (DEFMACRO VALPUT (ITEM VAL) `(SETF (VALGET ,ITEM) ,VAL)) (proclaim '(inline pointergp)) (DEFun POINTERGP (A B) (f> (valget A) (VALGET B))) ;(macro ALGV (L) `(AND $ALGEBRAIC (GET ,(CADR L) 'TELLRAT))) (defmacro algv (v) `(and $algebraic (get ,v 'tellrat))) (DEFMACRO EQN (&REST L) `(EQUAL . ,L)) (DEFMACRO RZERO () ''(0 . 1)) (DEFMACRO RZEROP (A) `(PZEROP (CAR ,A))) (defmacro PRIMPART (p) `(cadr (oldcontent ,p))) ;;poly constructor (defmacro make-poly (var &optional (terms-or-e nil options?) (c nil e-c?) (terms nil terms?)) (cond ((null options?) `(cons ,var '(1 1))) ((null e-c?) `(psimp ,var ,terms-or-e)) ((null terms?) `(list ,var ,terms-or-e ,c)) (t `(psimp ,var (list* ,terms-or-e ,c ,terms))))) ;;Poly selector functions (defmacro P-VAR (p) `(car ,p)) (defmacro P-TERMS (p) `(cdr ,p)) (defmacro P-LC (p) `(caddr ,p)) ;leading coefficient (defmacro P-LE (p) `(cadr ,p)) (defmacro P-RED (p) `(cdddr ,p)) ;;poly terms selectors (defmacro PT-LC (terms) `(cadr ,terms)) (defmacro PT-LE (terms) `(car ,terms)) (defmacro PT-RED (terms) `(cddr ,terms)) ;; Taken from SININT and RISCH. Somebody document these please. (DEFMACRO R+ (R . L) (COND ((NULL L) R) (T `(RATPL ,R (R+ ,@L))))) (DEFMACRO R* (R . L) (COND ((NULL L) R) (T `(RATTI ,R (R* ,@L) T)))) (DEFMACRO R- (R . L) (COND ((NULL L) `(RATMINUS (RATFIX ,R))) (T `(RATDIF (RATFIX ,R) (R+ ,@L))))) (defvar $ratvarswitch t) ;(defvar *rational-function-files* '( ;ratmac ;rat3a ;rat3b ;rat3c ;rat3e ;nrat4 ;ratout ;lesfac ;factor ;algfac ;nalgfa ;newfac ;ufact ;result ;spgcd))