(calc-rewrite-selection): Make rules a local variable.

(calc-rewr-sel): New variable.
(calc-rewrite-selection, calc-locate-selection-marker, calc-rewrite):
Use the declared variable calc-rewr-sel instead of sel.

(math-rewrite):  Use let* to declare variables.

(math-mt-many): Declare it.

(math-rewrite-whole-expr): New variable.
(math-rewrite, math-rewrite-phase): Replace variable expr by declared
variable.

(math-import-list): Declare it.

(math-rewrite-heads-heads, math-rewrite-heads-skips)
(math-rewrite-heads-blanks ): New variables.
(math-rewrite-heads, math-rewrite-heads-rec): Replace variables heads,
skips and blanks by declared variables.

(math-regs, math-num-regs, math-prog-last, math-bound-vars)
(math-conds, math-copy-neg, math-rhs, math-pattern, math-remembering)
(math-aliased-vars): Declare them.

(math-rwcomp-subst-old, math-rwcomp-subst-new)
(math-rwcomp-subst-old-func, math-rwcomp-subst-new-func):
New variables.
(math-rwcomp-substitute, math-rwcomp-subst-rec): Replace variables
old, new, old-func and new-func by declared variables.

(math-rwcomp-assoc-args, math-rwcomp-addsub-args):  Remove unnecessary
variable.

(math-rewrite-phase): Declare it.

(math-apply-rw-regs): New variable.
(math-apply-rewrites, math-rwapply-replace-regs,
math-rwapply-reg-looks-negp): Replace variable regs by declared variable.

(math-apply-rw-ruleset): New variable.
(math-apply-rewrites, math-rwapply-remember): Replace variable ruleset
by declared variable.
This commit is contained in:
Jay Belanger 2004-11-19 21:03:48 +00:00
parent 6de891db98
commit 40ead93715

View file

@ -3,8 +3,7 @@
;; Copyright (C) 1990, 1991, 1992, 1993, 2001 Free Software Foundation, Inc.
;; Author: David Gillespie <daveg@synaptics.com>
;; Maintainers: D. Goel <deego@gnufans.org>
;; Colin Walters <walters@debian.org>
;; Maintainer: Jay Belanger <belanger@truman.edu>
;; This file is part of GNU Emacs.
@ -36,6 +35,11 @@
(defvar math-rewrite-default-iters 100)
;; The variable calc-rewr-sel is local to calc-rewrite-selection and
;; calc-rewrite, but is used by calc-locate-selection-marker.
(defvar calc-rewr-sel)
(defun calc-rewrite-selection (rules-str &optional many prefix)
(interactive "sRewrite rule(s): \np")
(calc-slow-wrapper
@ -43,9 +47,10 @@
(let* ((num (max 1 (calc-locate-cursor-element (point))))
(reselect t)
(pop-rules nil)
rules
(entry (calc-top num 'entry))
(expr (car entry))
(sel (calc-auto-selection entry))
(calc-rewr-sel (calc-auto-selection entry))
(math-rewrite-selections t)
(math-rewrite-default-iters 1))
(if (or (null rules-str) (equal rules-str "") (equal rules-str "$"))
@ -73,10 +78,10 @@
(if (eq many 0)
(setq many '(var inf var-inf))
(if many (setq many (prefix-numeric-value many))))
(if sel
(if calc-rewr-sel
(setq expr (calc-replace-sub-formula (car entry)
sel
(list 'calcFunc-select sel)))
calc-rewr-sel
(list 'calcFunc-select calc-rewr-sel)))
(setq expr (car entry)
reselect nil
math-rewrite-selections nil))
@ -85,22 +90,22 @@
(math-rewrite
(calc-normalize expr)
rules many)))
sel nil
calc-rewr-sel nil
expr (calc-locate-select-marker expr))
(or (consp sel) (setq sel nil))
(or (consp calc-rewr-sel) (setq calc-rewr-sel nil))
(if pop-rules (calc-pop-stack 1))
(calc-pop-push-record-list 1 (or prefix "rwrt") (list expr)
(- num (if pop-rules 1 0))
(list (and reselect sel))))
(list (and reselect calc-rewr-sel))))
(calc-handle-whys)))
(defun calc-locate-select-marker (expr) ; changes "sel"
(defun calc-locate-select-marker (expr)
(if (Math-primp expr)
expr
(if (and (eq (car expr) 'calcFunc-select)
(= (length expr) 2))
(progn
(setq sel (if sel t (nth 1 expr)))
(setq calc-rewr-sel (if calc-rewr-sel t (nth 1 expr)))
(nth 1 expr))
(cons (car expr)
(mapcar 'calc-locate-select-marker (cdr expr))))))
@ -138,7 +143,7 @@
(setq many '(var inf var-inf))
(if many (setq many (prefix-numeric-value many))))
(setq expr (calc-normalize (math-rewrite expr rules many)))
(let (sel)
(let (calc-rewr-sel)
(setq expr (calc-locate-select-marker expr)))
(calc-pop-push-record-list n "rwrt" (list expr)))
(calc-handle-whys)))
@ -165,33 +170,38 @@
(calc-enter-result n "mtch" (math-match-patterns pat expr nil))))))
(defvar math-mt-many)
(defun math-rewrite (whole-expr rules &optional math-mt-many)
(let ((crules (math-compile-rewrites rules))
(heads (math-rewrite-heads 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 (function
(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))))
(save-excursion
(set-buffer trace-buffer)
(insert "\nrewrite to\n" fmt "\n"))))
(setq heads (math-rewrite-heads result heads t))))
result)))))
;; The variable math-rewrite-whole-expr is local to math-rewrite,
;; but is used by math-rewrite-phase
(defvar math-rewrite-whole-expr)
(defun math-rewrite (math-rewrite-whole-expr rules &optional math-mt-many)
(let* ((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 (function
(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))))
(save-excursion
(set-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 whole-expr nil nil))))
(let ((fmt (math-format-stack-value (list math-rewrite-whole-expr nil nil))))
(save-excursion
(set-buffer trace-buffer)
(setq truncate-lines t)
@ -203,26 +213,27 @@
(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 whole-expr nil nil))))
(let ((fmt (math-format-stack-value (list math-rewrite-whole-expr nil nil))))
(save-excursion
(set-buffer trace-buffer)
(insert "\nDone rewriting"
(if (= math-mt-many 0) " (reached iteration limit)" "")
":\n" fmt "\n"))))
whole-expr))
math-rewrite-whole-expr))
(defun math-rewrite-phase (sched)
(while (and sched (/= math-mt-many 0))
(if (listp (car sched))
(while (let ((save-expr whole-expr))
(while (let ((save-expr math-rewrite-whole-expr))
(math-rewrite-phase (car sched))
(not (equal whole-expr save-expr))))
(not (equal math-rewrite-whole-expr save-expr))))
(if (symbolp (car sched))
(progn
(setq whole-expr (math-normalize (list (car sched) whole-expr)))
(setq math-rewrite-whole-expr
(math-normalize (list (car sched) math-rewrite-whole-expr)))
(if trace-buffer
(let ((fmt (math-format-stack-value
(list whole-expr nil nil))))
(list math-rewrite-whole-expr nil nil))))
(save-excursion
(set-buffer trace-buffer)
(insert "\ncall "
@ -233,10 +244,10 @@
(save-excursion
(set-buffer trace-buffer)
(insert (format "\n(Phase %d)\n" math-rewrite-phase))))
(while (let ((save-expr whole-expr))
(setq whole-expr (math-normalize
(math-map-tree-rec whole-expr)))
(not (equal whole-expr save-expr)))))))
(while (let ((save-expr math-rewrite-whole-expr))
(setq math-rewrite-whole-expr (math-normalize
(math-map-tree-rec math-rewrite-whole-expr)))
(not (equal math-rewrite-whole-expr save-expr)))))))
(setq sched (cdr sched))))
(defun calcFunc-rewrite (expr rules &optional many)
@ -488,6 +499,28 @@
(defvar math-rewrite-whole nil)
(defvar math-make-import-list nil)
;; The variable math-import-list is local to part of math-compile-rewrites,
;; but is also used in a different part, and so the local version could
;; be affected by the non-local version when math-compile-rewrites calls itself.
(defvar math-import-list nil)
;; The variables math-regs, math-num-regs, math-prog-last, math-bound-vars,
;; math-conds, math-copy-neg, math-rhs, math-pattern, math-remembering and
;; math-aliased-vars are local to math-compile-rewrites,
;; but are used by many functions math-rwcomp-*, which are called by
;; math-compile-rewrites.
(defvar math-regs)
(defvar math-num-regs)
(defvar math-prog-last)
(defvar math-bound-vars)
(defvar math-conds)
(defvar math-copy-neg)
(defvar math-rhs)
(defvar math-pattern)
(defvar math-remembering)
(defvar math-aliased-vars)
(defun math-compile-rewrites (rules &optional name)
(if (eq (car-safe rules) 'var)
(let ((prop (get (nth 2 rules) 'math-rewrite-cache))
@ -731,26 +764,34 @@
(math-flatten-lands (nth 2 expr)))
(list expr)))
;; The variables math-rewrite-heads-heads (i.e.; heads for math-rewrite-heads)
;; math-rewrite-heads-blanks and math-rewrite-heads-skips are local to
;; math-rewrite-heads, but used by math-rewrite-heads-rec, which is called by
;; math-rewrite-heads.
(defvar math-rewrite-heads-heads)
(defvar math-rewrite-heads-skips)
(defvar math-rewrite-heads-blanks)
(defun math-rewrite-heads (expr &optional more all)
(let ((heads more)
(skips (and (not all)
(let ((math-rewrite-heads-heads more)
(math-rewrite-heads-skips (and (not all)
'(calcFunc-apply calcFunc-condition calcFunc-opt
calcFunc-por calcFunc-pnot)))
(blanks (and (not all)
(math-rewrite-heads-blanks (and (not all)
'(calcFunc-quote calcFunc-plain calcFunc-select
calcFunc-cons calcFunc-rcons
calcFunc-pand))))
(or (Math-primp expr)
(math-rewrite-heads-rec expr))
heads))
math-rewrite-heads-heads))
(defun math-rewrite-heads-rec (expr)
(or (memq (car expr) skips)
(or (memq (car expr) math-rewrite-heads-skips)
(progn
(or (memq (car expr) heads)
(memq (car expr) blanks)
(or (memq (car expr) math-rewrite-heads-heads)
(memq (car expr) math-rewrite-heads-blanks)
(memq 'algebraic (get (car expr) 'math-rewrite-props))
(setq heads (cons (car expr) heads)))
(setq math-rewrite-heads-heads (cons (car expr) math-rewrite-heads-heads)))
(while (setq expr (cdr expr))
(or (Math-primp (car expr))
(math-rewrite-heads-rec (car expr)))))))
@ -793,21 +834,31 @@
(list 'neg (list 'calcFunc-register (nth 1 entry)))
(list 'calcFunc-register (nth 1 entry)))))
(defun math-rwcomp-substitute (expr old new)
(if (and (eq (car-safe old) 'var)
(memq (car-safe new) '(var calcFunc-lambda)))
(let ((old-func (math-var-to-calcFunc old))
(new-func (math-var-to-calcFunc new)))
;; The variables math-rwcomp-subst-old, math-rwcomp-subst-new,
;; math-rwcomp-subst-old-func and math-rwcomp-subst-new-func
;; are local to math-rwcomp-substitute, but are used by
;; math-rwcomp-subst-rec, which is called by math-rwcomp-substitute.
(defvar math-rwcomp-subst-new)
(defvar math-rwcomp-subst-old)
(defvar math-rwcomp-subst-new-func)
(defvar math-rwcomp-subst-old-func)
(defun math-rwcomp-substitute (expr math-rwcomp-subst-old math-rwcomp-subst-new)
(if (and (eq (car-safe math-rwcomp-subst-old) 'var)
(memq (car-safe math-rwcomp-subst-new) '(var calcFunc-lambda)))
(let ((math-rwcomp-subst-old-func (math-var-to-calcFunc math-rwcomp-subst-old))
(math-rwcomp-subst-new-func (math-var-to-calcFunc math-rwcomp-subst-new)))
(math-rwcomp-subst-rec expr))
(let ((old-func nil))
(let ((math-rwcomp-subst-old-func nil))
(math-rwcomp-subst-rec expr))))
(defun math-rwcomp-subst-rec (expr)
(cond ((equal expr old) new)
(cond ((equal expr math-rwcomp-subst-old) math-rwcomp-subst-new)
((Math-primp expr) expr)
(t (if (eq (car expr) old-func)
(math-build-call new-func (mapcar 'math-rwcomp-subst-rec
(cdr expr)))
(t (if (eq (car expr) math-rwcomp-subst-old-func)
(math-build-call math-rwcomp-subst-new-func
(mapcar 'math-rwcomp-subst-rec
(cdr expr)))
(cons (car expr)
(mapcar 'math-rwcomp-subst-rec (cdr expr)))))))
@ -1268,22 +1319,18 @@
(defun math-rwcomp-assoc-args (expr)
(if (and (eq (car-safe (nth 1 expr)) (car expr))
(= (length (nth 1 expr)) 3))
(math-rwcomp-assoc-args (nth 1 expr))
(setq math-args (cons (nth 1 expr) math-args)))
(math-rwcomp-assoc-args (nth 1 expr)))
(if (and (eq (car-safe (nth 2 expr)) (car expr))
(= (length (nth 2 expr)) 3))
(math-rwcomp-assoc-args (nth 2 expr))
(setq math-args (cons (nth 2 expr) math-args))))
(math-rwcomp-assoc-args (nth 2 expr))))
(defun math-rwcomp-addsub-args (expr)
(if (memq (car-safe (nth 1 expr)) '(+ -))
(math-rwcomp-addsub-args (nth 1 expr))
(setq math-args (cons (nth 1 expr) math-args)))
(math-rwcomp-addsub-args (nth 1 expr)))
(if (eq (car expr) '-)
(setq math-args (cons (math-rwcomp-neg (nth 2 expr)) math-args))
()
(if (eq (car-safe (nth 2 expr)) '+)
(math-rwcomp-addsub-args (nth 2 expr))
(setq math-args (cons (nth 2 expr) math-args)))))
(math-rwcomp-addsub-args (nth 2 expr)))))
(defun math-rwcomp-order (a b)
(< (math-rwcomp-priority (car a))
@ -1419,14 +1466,23 @@
form
'(setcar rules orig))))
(setq math-rewrite-phase 1)
(defvar math-rewrite-phase 1)
(defun math-apply-rewrites (expr rules &optional heads ruleset)
;; The variable math-apply-rw-regs is local to math-apply-rewrites,
;; but is used by math-rwapply-replace-regs and math-rwapply-reg-looks-negp
;; which are called by math-apply-rewrites.
(defvar math-apply-rw-regs)
;; The variable math-apply-rw-ruleset is local to math-apply-rewrites,
;; but is used by math-rwapply-remember.
(defvar math-apply-rw-ruleset)
(defun math-apply-rewrites (expr rules &optional heads math-apply-rw-ruleset)
(and
(setq rules (cdr (or (assq (car-safe expr) rules)
(assq nil rules))))
(let ((result nil)
op regs inst part pc mark btrack
op math-apply-rw-regs inst part pc mark btrack
(tracing math-rwcomp-tracing)
(phase math-rewrite-phase))
(while rules
@ -1437,35 +1493,37 @@
(and (setq part (nth 3 (car rules)))
(not (memq phase part)))
(progn
(setq regs (car (car rules))
(setq math-apply-rw-regs (car (car rules))
pc (nth 1 (car rules))
btrack nil)
(aset regs 0 expr)
(aset math-apply-rw-regs 0 expr)
(while pc
(and tracing
(progn (terpri) (princ (car pc))
(if (and (natnump (nth 1 (car pc)))
(< (nth 1 (car pc)) (length regs)))
(princ (format "\n part = %s"
(aref regs (nth 1 (car pc))))))))
(< (nth 1 (car pc)) (length math-apply-rw-regs)))
(princ
(format "\n part = %s"
(aref math-apply-rw-regs (nth 1 (car pc))))))))
(cond ((eq (setq op (car (setq inst (car pc)))) 'func)
(if (and (consp (setq part (aref regs (car (cdr inst)))))
(if (and (consp
(setq part (aref math-apply-rw-regs (car (cdr inst)))))
(eq (car part)
(car (setq inst (cdr (cdr inst)))))
(progn
(while (and (setq inst (cdr inst)
part (cdr part))
inst)
(aset regs (car inst) (car part)))
(aset math-apply-rw-regs (car inst) (car part)))
(not (or inst part))))
(setq pc (cdr pc))
(math-rwfail)))
((eq op 'same)
(if (or (equal (setq part (aref regs (nth 1 inst)))
(setq mark (aref regs (nth 2 inst))))
(if (or (equal (setq part (aref math-apply-rw-regs (nth 1 inst)))
(setq mark (aref math-apply-rw-regs (nth 2 inst))))
(Math-equal part mark))
(setq pc (cdr pc))
(math-rwfail)))
@ -1474,22 +1532,23 @@
calc-matrix-mode
(not (eq calc-matrix-mode 'scalar))
(eq (car (nth 2 inst)) '*)
(consp (setq part (aref regs (car (cdr inst)))))
(consp (setq part (aref math-apply-rw-regs (car (cdr inst)))))
(eq (car part) '*)
(not (math-known-scalarp part)))
(setq mark (nth 3 inst)
pc (cdr pc))
(if (aref mark 4)
(progn
(aset regs (nth 4 inst) (nth 2 part))
(aset math-apply-rw-regs (nth 4 inst) (nth 2 part))
(aset mark 1 (cdr (cdr part))))
(aset regs (nth 4 inst) (nth 1 part))
(aset math-apply-rw-regs (nth 4 inst) (nth 1 part))
(aset mark 1 (cdr part)))
(aset mark 0 (cdr part))
(aset mark 2 0))
((eq op 'try)
(if (and (consp (setq part (aref regs (car (cdr inst)))))
(if (and (consp (setq part
(aref math-apply-rw-regs (car (cdr inst)))))
(memq (car part) (nth 2 inst))
(= (length part) 3)
(or (not (eq (car part) '/))
@ -1525,7 +1584,7 @@
op))
btrack (cons pc btrack)
pc (cdr pc))
(aset regs (nth 2 inst) (car op))
(aset math-apply-rw-regs (nth 2 inst) (car op))
(aset mark 0 op)
(aset mark 1 op)
(aset mark 2 (if (cdr (cdr op)) 1 0)))
@ -1537,12 +1596,12 @@
(progn
(setq mark (nth 3 inst)
pc (cdr pc))
(aset regs (nth 4 inst) (nth 1 part))
(aset math-apply-rw-regs (nth 4 inst) (nth 1 part))
(aset mark 1 -1)
(aset mark 2 4))
(setq mark (nth 3 inst)
pc (cdr pc))
(aset regs (nth 4 inst) part)
(aset math-apply-rw-regs (nth 4 inst) part)
(aset mark 2 3))
(math-rwfail))))
@ -1551,7 +1610,7 @@
mark (nth 3 part)
op (aref mark 2)
pc (cdr pc))
(aset regs (nth 2 inst)
(aset math-apply-rw-regs (nth 2 inst)
(cond
((eq op 0)
(if (eq (aref mark 0) (aref mark 1))
@ -1591,17 +1650,17 @@
((eq op 'select)
(setq pc (cdr pc))
(if (and (consp (setq part (aref regs (nth 1 inst))))
(if (and (consp (setq part (aref math-apply-rw-regs (nth 1 inst))))
(eq (car part) 'calcFunc-select))
(aset regs (nth 2 inst) (nth 1 part))
(aset math-apply-rw-regs (nth 2 inst) (nth 1 part))
(if math-rewrite-selections
(math-rwfail)
(aset regs (nth 2 inst) part))))
(aset math-apply-rw-regs (nth 2 inst) part))))
((eq op 'same-neg)
(if (or (equal (setq part (aref regs (nth 1 inst)))
(if (or (equal (setq part (aref math-apply-rw-regs (nth 1 inst)))
(setq mark (math-neg
(aref regs (nth 2 inst)))))
(aref math-apply-rw-regs (nth 2 inst)))))
(Math-equal part mark))
(setq pc (cdr pc))
(math-rwfail)))
@ -1613,22 +1672,24 @@
op (aref mark 2))
(cond ((eq op 0)
(if (setq op (cdr (aref mark 1)))
(aset regs (nth 4 inst) (car (aset mark 1 op)))
(aset math-apply-rw-regs (nth 4 inst)
(car (aset mark 1 op)))
(if (nth 5 inst)
(progn
(aset mark 2 3)
(aset regs (nth 4 inst)
(aref regs (nth 1 inst))))
(aset math-apply-rw-regs (nth 4 inst)
(aref math-apply-rw-regs (nth 1 inst))))
(math-rwfail t))))
((eq op 1)
(if (setq op (cdr (aref mark 1)))
(aset regs (nth 4 inst) (car (aset mark 1 op)))
(aset math-apply-rw-regs (nth 4 inst)
(car (aset mark 1 op)))
(if (= (aref mark 3) 1)
(if (nth 5 inst)
(progn
(aset mark 2 3)
(aset regs (nth 4 inst)
(aref regs (nth 1 inst))))
(aset math-apply-rw-regs (nth 4 inst)
(aref math-apply-rw-regs (nth 1 inst))))
(math-rwfail t))
(aset mark 2 2)
(aset mark 1 (cons nil (aref mark 0)))
@ -1666,19 +1727,20 @@
(list '- part
(nth 1 (car mark)))
(list op part (car mark))))))
(aset regs (nth 4 inst) part))
(aset math-apply-rw-regs (nth 4 inst) part))
(if (nth 5 inst)
(progn
(aset mark 2 3)
(aset regs (nth 4 inst)
(aref regs (nth 1 inst))))
(aset math-apply-rw-regs (nth 4 inst)
(aref math-apply-rw-regs (nth 1 inst))))
(math-rwfail t))))
((eq op 4)
(setq btrack (cdr btrack)))
(t (math-rwfail t))))
((eq op 'integer)
(if (Math-integerp (setq part (aref regs (nth 1 inst))))
(if (Math-integerp (setq part
(aref math-apply-rw-regs (nth 1 inst))))
(setq pc (cdr pc))
(if (Math-primp part)
(math-rwfail)
@ -1688,7 +1750,7 @@
(math-rwfail)))))
((eq op 'real)
(if (Math-realp (setq part (aref regs (nth 1 inst))))
(if (Math-realp (setq part (aref math-apply-rw-regs (nth 1 inst))))
(setq pc (cdr pc))
(if (Math-primp part)
(math-rwfail)
@ -1698,7 +1760,7 @@
(math-rwfail)))))
((eq op 'constant)
(if (math-constp (setq part (aref regs (nth 1 inst))))
(if (math-constp (setq part (aref math-apply-rw-regs (nth 1 inst))))
(setq pc (cdr pc))
(if (Math-primp part)
(math-rwfail)
@ -1708,7 +1770,8 @@
(math-rwfail)))))
((eq op 'negative)
(if (math-looks-negp (setq part (aref regs (nth 1 inst))))
(if (math-looks-negp (setq part
(aref math-apply-rw-regs (nth 1 inst))))
(setq pc (cdr pc))
(if (Math-primp part)
(math-rwfail)
@ -1718,15 +1781,16 @@
(math-rwfail)))))
((eq op 'rel)
(setq part (math-compare (aref regs (nth 1 inst))
(aref regs (nth 3 inst)))
(setq part (math-compare (aref math-apply-rw-regs (nth 1 inst))
(aref math-apply-rw-regs (nth 3 inst)))
op (nth 2 inst))
(if (= part 2)
(setq part (math-rweval
(math-simplify
(calcFunc-sign
(math-sub (aref regs (nth 1 inst))
(aref regs (nth 3 inst))))))))
(math-sub
(aref math-apply-rw-regs (nth 1 inst))
(aref math-apply-rw-regs (nth 3 inst))))))))
(if (cond ((eq op 'calcFunc-eq)
(eq part 0))
((eq op 'calcFunc-neq)
@ -1743,44 +1807,48 @@
(math-rwfail)))
((eq op 'func-def)
(if (and (consp (setq part (aref regs (car (cdr inst)))))
(eq (car part)
(car (setq inst (cdr (cdr inst))))))
(if (and
(consp (setq part (aref math-apply-rw-regs (car (cdr inst)))))
(eq (car part)
(car (setq inst (cdr (cdr inst))))))
(progn
(setq inst (cdr inst)
mark (car inst))
(while (and (setq inst (cdr inst)
part (cdr part))
inst)
(aset regs (car inst) (car part)))
(aset math-apply-rw-regs (car inst) (car part)))
(if (or inst part)
(setq pc (cdr pc))
(while (eq (car (car (setq pc (cdr pc))))
'func-def))
(setq pc (cdr pc)) ; skip over "func"
(while mark
(aset regs (cdr (car mark)) (car (car mark)))
(aset math-apply-rw-regs (cdr (car mark)) (car (car mark)))
(setq mark (cdr mark)))))
(math-rwfail)))
((eq op 'func-opt)
(if (or (not (and (consp
(setq part (aref regs (car (cdr inst)))))
(eq (car part) (nth 2 inst))))
(if (or (not
(and
(consp
(setq part (aref math-apply-rw-regs (car (cdr inst)))))
(eq (car part) (nth 2 inst))))
(and (= (length part) 2)
(setq part (nth 1 part))))
(progn
(setq mark (nth 3 inst))
(aset regs (nth 4 inst) part)
(aset math-apply-rw-regs (nth 4 inst) part)
(while (eq (car (car (setq pc (cdr pc)))) 'func-def))
(setq pc (cdr pc)) ; skip over "func"
(while mark
(aset regs (cdr (car mark)) (car (car mark)))
(aset math-apply-rw-regs (cdr (car mark)) (car (car mark)))
(setq mark (cdr mark))))
(setq pc (cdr pc))))
((eq op 'mod)
(if (if (Math-zerop (setq part (aref regs (nth 1 inst))))
(if (if (Math-zerop
(setq part (aref math-apply-rw-regs (nth 1 inst))))
(Math-zerop (nth 3 inst))
(and (not (Math-zerop (nth 2 inst)))
(progn
@ -1793,34 +1861,38 @@
(math-rwfail)))
((eq op 'apply)
(if (and (consp (setq part (aref regs (car (cdr inst)))))
(if (and (consp
(setq part (aref math-apply-rw-regs (car (cdr inst)))))
(not (Math-objvecp part))
(not (eq (car part) 'var)))
(progn
(aset regs (nth 2 inst)
(aset math-apply-rw-regs (nth 2 inst)
(math-calcFunc-to-var (car part)))
(aset regs (nth 3 inst)
(aset math-apply-rw-regs (nth 3 inst)
(cons 'vec (cdr part)))
(setq pc (cdr pc)))
(math-rwfail)))
((eq op 'cons)
(if (and (consp (setq part (aref regs (car (cdr inst)))))
(if (and (consp
(setq part (aref math-apply-rw-regs (car (cdr inst)))))
(eq (car part) 'vec)
(cdr part))
(progn
(aset regs (nth 2 inst) (nth 1 part))
(aset regs (nth 3 inst) (cons 'vec (cdr (cdr part))))
(aset math-apply-rw-regs (nth 2 inst) (nth 1 part))
(aset math-apply-rw-regs (nth 3 inst)
(cons 'vec (cdr (cdr part))))
(setq pc (cdr pc)))
(math-rwfail)))
((eq op 'rcons)
(if (and (consp (setq part (aref regs (car (cdr inst)))))
(if (and (consp
(setq part (aref math-apply-rw-regs (car (cdr inst)))))
(eq (car part) 'vec)
(cdr part))
(progn
(aset regs (nth 2 inst) (calcFunc-rhead part))
(aset regs (nth 3 inst) (calcFunc-rtail part))
(aset math-apply-rw-regs (nth 2 inst) (calcFunc-rhead part))
(aset math-apply-rw-regs (nth 3 inst) (calcFunc-rtail part))
(setq pc (cdr pc)))
(math-rwfail)))
@ -1833,19 +1905,20 @@
(math-rwfail)))
((eq op 'let)
(aset regs (nth 1 inst)
(aset math-apply-rw-regs (nth 1 inst)
(math-rweval
(math-normalize
(math-rwapply-replace-regs (nth 2 inst)))))
(setq pc (cdr pc)))
((eq op 'copy)
(aset regs (nth 2 inst) (aref regs (nth 1 inst)))
(aset math-apply-rw-regs (nth 2 inst)
(aref math-apply-rw-regs (nth 1 inst)))
(setq pc (cdr pc)))
((eq op 'copy-neg)
(aset regs (nth 2 inst)
(math-rwapply-neg (aref regs (nth 1 inst))))
(aset math-apply-rw-regs (nth 2 inst)
(math-rwapply-neg (aref math-apply-rw-regs (nth 1 inst))))
(setq pc (cdr pc)))
((eq op 'alt)
@ -1904,7 +1977,7 @@
(cond ((Math-primp expr)
expr)
((eq (car expr) 'calcFunc-register)
(setq expr (aref regs (nth 1 expr)))
(setq expr (aref math-apply-rw-regs (nth 1 expr)))
(if (eq (car-safe expr) '*)
(if (eq (nth 1 expr) -1)
(math-neg (nth 2 expr))
@ -1953,7 +2026,7 @@
(math-rwapply-reg-neg (nth 1 expr)))
((and (eq (car expr) 'neg)
(eq (car-safe (nth 1 expr)) 'calcFunc-register)
(math-scalarp (aref regs (nth 1 (nth 1 expr)))))
(math-scalarp (aref math-apply-rw-regs (nth 1 (nth 1 expr)))))
(math-neg (math-rwapply-replace-regs (nth 1 expr))))
((and (eq (car expr) '+)
(math-rwapply-reg-looks-negp (nth 1 expr)))
@ -2001,14 +2074,14 @@
(if (Math-primp (nth 1 expr))
(nth 1 expr)
(if (eq (car (nth 1 expr)) 'calcFunc-register)
(aref regs (nth 1 (nth 1 expr)))
(aref math-apply-rw-regs (nth 1 (nth 1 expr)))
(cons (car (nth 1 expr)) (mapcar 'math-rwapply-replace-regs
(cdr (nth 1 expr)))))))
(t (cons (car expr) (mapcar 'math-rwapply-replace-regs (cdr expr))))))
(defun math-rwapply-reg-looks-negp (expr)
(if (eq (car-safe expr) 'calcFunc-register)
(math-looks-negp (aref regs (nth 1 expr)))
(math-looks-negp (aref math-apply-rw-regs (nth 1 expr)))
(if (memq (car-safe expr) '(* /))
(or (math-rwapply-reg-looks-negp (nth 1 expr))
(math-rwapply-reg-looks-negp (nth 2 expr))))))
@ -2025,8 +2098,8 @@
(math-rwapply-reg-neg (nth 2 expr)))))))
(defun math-rwapply-remember (old new)
(let ((varval (symbol-value (nth 2 (car ruleset))))
(rules (assq (car-safe old) ruleset)))
(let ((varval (symbol-value (nth 2 (car math-apply-rw-ruleset))))
(rules (assq (car-safe old) math-apply-rw-ruleset)))
(if (and (eq (car-safe varval) 'vec)
(not (memq (car-safe old) '(nil schedule + -)))
rules)