Function: math-rewrite

math-rewrite is an autoloaded and byte-compiled function defined in calc-rewr.el.gz.

Signature

(math-rewrite REWRITE-WHOLE-EXPR RULES &optional MT-MANY)

Source Code

;; Defined in /usr/src/emacs/lisp/calc/calc-rewr.el.gz
(defun math-rewrite (rewrite-whole-expr rules &optional mt-many)
  (let* ((math-rewrite-whole-expr rewrite-whole-expr)
         (math-mt-many mt-many)
         (crules (math-compile-rewrites rules))
         (heads (math-rewrite-heads math-rewrite-whole-expr))
         (trace-buffer (get-buffer "*Trace*"))
         (calc-display-just 'center)
         (calc-display-origin 39)
         (calc-line-breaking 78)
         (calc-line-numbering nil)
         (calc-show-selections t)
         (calc-why nil)
         (math-mt-func (lambda (x)
                         (let ((result (math-apply-rewrites x (cdr crules)
                                                            heads crules)))
                           (if result
                               (progn
                                 (if trace-buffer
                                     (let ((fmt (math-format-stack-value
                                                 (list result nil nil))))
                                       (with-current-buffer trace-buffer
                                         (insert "\nrewrite to\n" fmt "\n"))))
                                 (setq heads (math-rewrite-heads result heads t))))
                           result))))
    (if trace-buffer
	(let ((fmt (math-format-stack-value (list math-rewrite-whole-expr nil nil))))
	  (with-current-buffer trace-buffer
	    (setq truncate-lines t)
	    (goto-char (point-max))
	    (insert "\n\nBegin rewriting\n" fmt "\n"))))
    (or math-mt-many (setq math-mt-many (or (nth 1 (car crules))
				    math-rewrite-default-iters)))
    (if (equal math-mt-many '(var inf var-inf)) (setq math-mt-many 1000000))
    (if (equal math-mt-many '(neg (var inf var-inf))) (setq math-mt-many -1000000))
    (math-rewrite-phase (nth 3 (car crules)))
    (if trace-buffer
	(let ((fmt (math-format-stack-value (list math-rewrite-whole-expr nil nil))))
	  (with-current-buffer trace-buffer
	    (insert "\nDone rewriting"
		    (if (= math-mt-many 0) " (reached iteration limit)" "")
		    ":\n" fmt "\n"))))
    math-rewrite-whole-expr))