;;; -*- 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 ;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; 1001 TRANSLATE properties for everyone. ;;; ;;; (c) Copyright 1980 Massachusetts Institute of Technology ;;; ;;; Maintained by GJC ;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; (in-package "MAXIMA") (macsyma-module trans4) (TRANSL-MODULE TRANS4) ;;; These are translation properties for various operators. (DEF%TR MNCTIMES (FORM) (SETQ FORM (TR-ARGS (CDR FORM))) (COND ((= (LENGTH FORM) 2) `($ANY NCMUL2 . ,FORM)) (T `($ANY NCMULN (LIST . ,FORM) NIL)))) (DEF%TR MNCEXPT (FORM) `($ANY . (NCPOWER ,@(TR-ARGS (CDR FORM))))) ; maybe this ? (COMMENT (DEFUN STRICT-UNION-MODE-OF-TFORMS (L) (DO ((M (CAAR L)) (L (CDR L)(CDR L))) ((NULL L) M) (AND (NOT (EQ M (CAAR L))) (RETURN '$ANY)))) (DEFMACRO DEF%MODAL1%TR (NAME ARGS &REST CASES) `(DEF%TR ,NAME (*TR-FORM-ARGUMENT*) (COND ((= (LENGTH *TR-FORM-ARGUMENT*) ,(f1+ (LENGTH ARGS))) (LET* ((*TR-ARGS* (MAPCAR #'TRANSLATE (CDR *TR-FORM-ARGUMENT*))) (*MODE* (STRICT-UNION-MODE-OF-TFORMS *TR-ARGS*))) (SETQ *TR-ARGS* (MAPCAR #'CDR *TR-ARGS*))))))) (DEF-MODAL-TR $BETA (X Y) ($FLOAT (//$ (*$ ($GAMMA X) ($GAMMA Y)) ($GAMMA (+$ X Y)))) ($NUMBER (QUOTIENT (TIMES ($GAMMA X) ($GAMMA Y)) ($GAMMA (PLUS X Y)))) ($ANY (SIMPLIFY (LIST '($BETA) X Y)))) (DEF-MODAL-TR $GAMMA (X) ($FLOAT ($GAMMA X)) ($ANY (SIMPLIFY ($GAMMA X))))) ;;; end of commented out code. (DEF%TR $REMAINDER (FORM) (let ((n (TR-NARGS-CHECK FORM '(2 . NIL))) (tr-args (mapcar 'translate (cdr form)))) (cond ((and (= n 2) (eq (caar tr-args) '$fixnum) (EQ (CAR (CADR TR-ARGS)) '$FIXNUM)) `($FIXNUM . (REMAINDER ,(CDR (CAR TR-ARGS)) ,(CDR (CADR TR-ARGS))))) (T (CALL-AND-SIMP '$ANY '$REMAINDER (MAPCAR 'CDR TR-ARGS)))))) (DEF%TR $BETA (FORM) `($ANY . (SIMPLIFY (LIST '($BETA) ,@(TR-ARGS (CDR FORM)))))) (DEF%TR MFACTORIAL (FORM) (SETQ FORM (TRANSLATE (CADR FORM))) (COND ((EQ (CAR FORM) '$FIXNUM) `($NUMBER . (FACTORIAL ,(CDR FORM)))) (T `($ANY . (SIMPLIFY `((MFACTORIAL) ,,(CDR FORM))))))) (DEF%TR %SUM (FORM) ;; this is WRONG. ---FIX--THIS--YOU--LOSER----***** `($ANY . (MEVAL ',FORM))) (DEF%TR %PRODUCT (FORM) `($ANY . (MEVAL ',FORM))) ;(DEF%TR %BINOMIAL (FORM) ; (TR-NARGS-CHECK FORM '(2 .2)) ; `($ANY . ($BINOMIAL ,@(TR-ARGS (CDR FORM))))) ;; From MATCOM. ;; Temp autoloads needed for pdp-10. There is a better way ;; to distribute this info, too bad I never implemented it. (MAPC #'(LAMBDA (X) (LET ((OLD-PROP (GET (CDR X) 'AUTOLOAD))) (IF (NOT (NULL OLD-PROP)) (PUTPROP (CAR X) OLD-PROP 'AUTOLOAD)))) '((PROC-$MATCHDECLARE . $MATCHDECLARE) (PROC-$DEFMATCH . $DEFMATCH) (PROC-$DEFRULE . $DEFRULE) (PROC-$TELLSIMPAFTER . $TELLSIMPAFTER) (PROC-$TELLSIMP . $TELLSIMP ))) (DEFUN YUK-SU-META-PROP (F FORM) (LET ((META-PROP-P T) (META-PROP-L NIL)) (FUNCALL F (CDR FORM)) `($ANY . (PROGN 'compile ,@(MAPCAR #'PATCH-UP-MEVAL-IN-FSET (NREVERSE META-PROP-L)))))) (DEF%TR $MATCHDECLARE (FORM) (DO ((L (CDR FORM) (CDDR L)) (VARS ())) ((NULL L) `($ANY. (PROGN 'COMPILE ,@(MAPCAR #'(LAMBDA (VAR) (DTRANSLATE `(($DEFINE_VARIABLE) ,VAR ((MQUOTE) ,VAR) $ANY))) VARS) ,(DTRANSLATE `((SUB_$MATCHDECLARE) ,@(CDR FORM)))))) (COND ((ATOM (CAR L)) (PUSH (CAR L) VARS)) ((EQ (CAAAR L) 'MLIST) (SETQ VARS (APPEND (CDAR L) VARS)))))) (DEF%TR SUB_$MATCHDECLARE (FORM) (YUK-SU-META-PROP 'PROC-$MATCHDECLARE `(($MATCHDECLARE) ,@(CDR FORM)))) (DEF%TR $DEFMATCH (FORM) (YUK-SU-META-PROP 'PROC-$DEFMATCH FORM)) (DEF%TR $TELLSIMP (FORM) (YUK-SU-META-PROP 'PROC-$TELLSIMP FORM)) (DEF%TR $TELLSIMPAFTER (FORM) (YUK-SU-META-PROP 'PROC-$TELLSIMPAFTER FORM)) (DEF%TR $DEFRULE (FORM) (YUK-SU-META-PROP 'PROC-$DEFRULE FORM)) (DEFUN PATCH-UP-MEVAL-IN-FSET (FORM) (COND ((NOT (EQ (CAR FORM) 'FSET)) FORM) (T (TR-FORMAT "~%Translating rule or match ~:M" (CADR (CADR FORM))) (LET ((L (LISP->LISP-TR-LAMBDA (CADR (CADDR FORM))))) (IF (NULL L) FORM `(DEFUN ,(CADR (CADR FORM)) ,@(CDR L))))))) (DEFVAR LISP->LISP-TR-LAMBDA T) (DEFUN LISP->LISP-TR-LAMBDA (L) ;; basically, a lisp->lisp translation, setting up ;; the proper lambda contexts for the special forms, ;; and calling TRANSLATE on the "lusers" generated by ;; Fateman braindamage, (MEVAL '$A), (MEVAL '(($F) $X)). (IF LISP->LISP-TR-LAMBDA (CATCH 'LISP->LISP-TR-LAMBDA (TR-LISP->LISP L)) ())) (DEFUN TR-LISP->LISP (EXP) (IF (ATOM EXP) (CDR (TRANSLATE-ATOM EXP)) (LET ((OP (CAR EXP))) (IF (SYMBOLP OP) (FUNCALL (OR (GET OP 'TR-LISP->LISP) #'TR-LISP->LISP-DEFAULT) EXP) (PROGN (TR-TELL "Punting: non-symbolic operator") (THROW 'LISP->LISP-TR-LAMBDA ())))))) (DEFUN TR-LISP->LISP-DEFAULT (EXP) (COND ((MACSYMA-SPECIAL-OP-P (CAR EXP)) (TR-TELL "Punting: unhandled special operator ~:@M" (CAR EXP)) (THROW 'LISP->LISP-TR-LAMBDA ())) ('ELSE (TR-LISP->LISP-FUN EXP)))) (DEFUN TR-LISP->LISP-FUN (EXP) (CONS (CAR EXP) (MAPTR-LISP->LISP (CDR EXP)))) (DEFUN MAPTR-LISP->LISP (L) (MAPCAR #'TR-LISP->LISP L)) (DEFUN-prop (declare TR-LISP->LISP) (FORM) form) (DEFUN-prop (LAMBDA TR-LISP->LISP) (FORM) (LET (((() ARGLIST . BODY) FORM)) (MAPC #'TBIND ARGLIST) (SETQ BODY (MAPTR-LISP->LISP BODY)) `(function (LAMBDA ,(TUNBINDS ARGLIST) ,@BODY)))) (DEFUN-prop (PROG TR-LISP->LISP) (FORM) (LET (((() ARGLIST . BODY) FORM)) (MAPC #'TBIND ARGLIST) (SETQ BODY (MAPCAR #'(LAMBDA (X) (IF (ATOM X) X (TR-LISP->LISP X))) BODY)) `(PROG ,(TUNBINDS ARGLIST) ,@BODY))) ;;(DEFUN RETLIST FEXPR (L) ;; (CONS '(MLIST SIMP) ;; (MAPCAR #'(LAMBDA (Z) (LIST '(MEQUAL SIMP) Z (MEVAL Z))) L))) (DEFUN-prop (RETLIST TR-LISP->LISP) (FORM) (PUSH-AUTOLOAD-DEF 'MARRAYREF '(RETLIST_TR)) `(RETLIST_TR ,@(MAPCAN #'(LAMBDA (Z) (LIST `',Z (TR-LISP->LISP Z))) (CDR FORM)))) (DEFUN-prop (QUOTE TR-LISP->LISP) (FORM) FORM) (DEFPROP CATCH TR-LISP->LISP-FUN TR-LISP->LISP) (DEFPROP THROW TR-LISP->LISP-FUN TR-LISP->LISP) (DEFPROP RETURN TR-LISP->LISP-FUN TR-LISP->LISP) (DEFPROP FUNCTION TR-LISP->LISP-FUN TR-LISP->LISP) (DEFUN-prop (SETQ TR-LISP->LISP) (FORM) (DO ((L (CDR FORM) (CDDR L)) (N ())) ((NULL L) (CONS 'SETQ (NREVERSE N))) (PUSH (CAR L) N) (PUSH (TR-LISP->LISP (CADR L)) N))) (DEFUN-prop (MSETQ TR-LISP->LISP) (FORM) (CDR (TRANSLATE `((MSETQ) ,@(CDR FORM))))) (DEFUN-prop (COND TR-LISP->LISP) (FORM) (CONS 'COND (MAPCAR #'MAPTR-LISP->LISP (CDR FORM)))) (DEFPROP NOT TR-LISP->LISP-FUN TR-LISP->LISP) (DEFPROP AND TR-LISP->LISP-FUN TR-LISP->LISP) (DEFPROP OR TR-LISP->LISP-FUN TR-LISP->LISP) (DEFVAR UNBOUND-MEVAL-KLUDGE-FIX T) (DEFUN-prop (MEVAL TR-LISP->LISP) (FORM) (SETQ FORM (CADR FORM)) (COND ((AND (NOT (ATOM FORM)) (EQ (CAR FORM) 'QUOTE)) (CDR (TRANSLATE (CADR FORM)))) (UNBOUND-MEVAL-KLUDGE-FIX ;; only case of unbound MEVAL is in output of DEFMATCH, ;; and appears like a useless double-evaluation of arguments. FORM) ('ELSE (TR-TELL "Punting: Unbound MEVAL found!") (THROW 'LISP->LISP-TR-LAMBDA ())))) (DEFUN-prop (IS TR-LISP->LISP) (FORM) (SETQ FORM (CADR FORM)) (COND ((AND (NOT (ATOM FORM)) (EQ (CAR FORM) 'QUOTE)) (CDR (TRANSLATE `(($IS) ,(CADR FORM))))) ('ELSE (TR-TELL "Punting: Unbound IS found!") (THROW 'LISP->LISP-TR-LAMBDA ()))))