From 9052f9f01ea219b9e9819b3cb3c6bfd9a6751460 Mon Sep 17 00:00:00 2001 From: Jay Belanger Date: Sun, 29 Jul 2012 13:51:16 -0500 Subject: [PATCH] calc/calc.el (math-normalize-error): New variable. (math-normalize): Set `math-normalize-error' to t when there's an error. calc/calc-alg.el (math-simplify): Don't simplify when `math-normalize' returns an error. --- lisp/ChangeLog | 9 +++++++++ lisp/calc/calc-alg.el | 12 ++++++++---- lisp/calc/calc.el | 11 +++++++++++ 3 files changed, 28 insertions(+), 4 deletions(-) diff --git a/lisp/ChangeLog b/lisp/ChangeLog index a6fd9c3e0d3..18772064d7d 100644 --- a/lisp/ChangeLog +++ b/lisp/ChangeLog @@ -1,3 +1,12 @@ +2012-07-29 Jay Belanger + + * calc/calc.el (math-normalize-error): New variable. + (math-normalize): Set `math-normalize-error' to t + when there's an error. + + * calc/calc-alg.el (math-simplify): Don't simplify when + `math-normalize' returns an error. + 2012-07-29 Eli Zaretskii * international/mule-cmds.el (set-locale-environment): Revert last diff --git a/lisp/calc/calc-alg.el b/lisp/calc/calc-alg.el index 50b31400a6a..3182e85a8c6 100644 --- a/lisp/calc/calc-alg.el +++ b/lisp/calc/calc-alg.el @@ -356,6 +356,8 @@ ;; math-simplify-step, which is called by math-simplify. (defvar math-top-only) +;; math-normalize-error is declared in calc.el. +(defvar math-normalize-error) (defun math-simplify (top-expr) (let ((math-simplifying t) (math-top-only (consp calc-simplify-mode)) @@ -383,10 +385,12 @@ (calc-with-default-simplification (while (let ((r simp-rules)) (setq res (math-normalize top-expr)) - (while r - (setq res (math-rewrite res (car r)) - r (cdr r))) - (not (equal top-expr (setq res (math-simplify-step res))))) + (if (not math-normalize-error) + (progn + (while r + (setq res (math-rewrite res (car r)) + r (cdr r))) + (not (equal top-expr (setq res (math-simplify-step res))))))) (setq top-expr res))))) top-expr) diff --git a/lisp/calc/calc.el b/lisp/calc/calc.el index 7fb9148535a..a149cfe7966 100644 --- a/lisp/calc/calc.el +++ b/lisp/calc/calc.el @@ -2583,7 +2583,11 @@ largest Emacs integer.") ;;; Reduce an object to canonical (normalized) form. [O o; Z Z] [Public] (defvar math-normalize-a) +(defvar math-normalize-error nil + "Non-nil if the last call the `math-normalize' returned an error.") + (defun math-normalize (math-normalize-a) + (setq math-normalize-error nil) (cond ((not (consp math-normalize-a)) (if (integerp math-normalize-a) @@ -2672,31 +2676,38 @@ largest Emacs integer.") (fboundp (car math-normalize-a)))) (apply (car math-normalize-a) args))))) (wrong-number-of-arguments + (setq math-normalize-error t) (calc-record-why "*Wrong number of arguments" (cons (car math-normalize-a) args)) nil) (wrong-type-argument + (setq math-normalize-error t) (or calc-next-why (calc-record-why "Wrong type of argument" (cons (car math-normalize-a) args))) nil) (args-out-of-range + (setq math-normalize-error t) (calc-record-why "*Argument out of range" (cons (car math-normalize-a) args)) nil) (inexact-result + (setq math-normalize-error t) (calc-record-why "No exact representation for result" (cons (car math-normalize-a) args)) nil) (math-overflow + (setq math-normalize-error t) (calc-record-why "*Floating-point overflow occurred" (cons (car math-normalize-a) args)) nil) (math-underflow + (setq math-normalize-error t) (calc-record-why "*Floating-point underflow occurred" (cons (car math-normalize-a) args)) nil) (void-variable + (setq math-normalize-error t) (if (eq (nth 1 err) 'var-EvalRules) (progn (setq var-EvalRules nil) -- 2.39.2