Function: math-normalize

math-normalize is a byte-compiled function defined in calc.el.gz.

Signature

(math-normalize A)

Source Code

;; Defined in /usr/src/emacs/lisp/calc/calc.el.gz
(defun math-normalize (a)
  (setq math-normalize-error nil)
  (cond
   ((not (consp a)) a)
   ((eq (car a) 'float)
    (math-make-float (math-normalize (nth 1 a))
                     (nth 2 a)))
   ((or (memq (car a)
              '(frac cplx polar hms date mod sdev intv vec var quote
                     special-const calcFunc-if calcFunc-lambda
                     calcFunc-quote calcFunc-condition
                     calcFunc-evalto))
	(integerp (car a))
	(and (consp (car a))
             (not (eq (car (car a)) 'lambda))))
    (require 'calc-ext)
    (math-normalize-fancy a))
   (t
    (or (and calc-simplify-mode
	     (require 'calc-ext)
             (math-normalize-nonstandard a))
	(let ((args (mapcar #'math-normalize (cdr a))))
	  (or (condition-case err
		  (let ((func
                         (assq (car a) '( ( + . math-add )
                                          ( - . math-sub )
                                          ( * . math-mul )
                                          ( / . math-div )
                                          ( % . math-mod )
                                          ( ^ . math-pow )
                                          ( neg . math-neg )
                                          ( | . math-concat ) ))))
		    (or (and var-EvalRules
			     (progn
			       (or (eq var-EvalRules math-eval-rules-cache-tag)
				   (progn
				     (require 'calc-ext)
				     (math-recompile-eval-rules)))
			       (and (or math-eval-rules-cache-other
					(assq (car a)
                                              math-eval-rules-cache))
				    (math-apply-rewrites
				     (cons (car a) args)
				     (cdr math-eval-rules-cache)
				     nil math-eval-rules-cache))))
			(if func
			    (apply (cdr func) args)
			  (and (or (consp (car a))
				   (fboundp (car a))
				   (and (not (featurep 'calc-ext))
					(require 'calc-ext)
					(fboundp (car a))))
			       (apply (car a) args)))))
		(wrong-number-of-arguments
                 (setq math-normalize-error t)
		 (calc-record-why "*Wrong number of arguments"
				  (cons (car a) args))
		 nil)
		(wrong-type-argument
		 (or calc-next-why
                     (calc-record-why "Wrong type of argument"
                                      (cons (car a) args)))
		 nil)
		(args-out-of-range
                 (setq math-normalize-error t)
		 (calc-record-why "*Argument out of range"
                                  (cons (car a) args))
		 nil)
		(inexact-result
		 (calc-record-why "No exact representation for result"
				  (cons (car a) args))
		 nil)
		(math-overflow
                 (setq math-normalize-error t)
		 (calc-record-why "*Floating-point overflow occurred"
				  (cons (car a) args))
		 nil)
		(math-underflow
                 (setq math-normalize-error t)
		 (calc-record-why "*Floating-point underflow occurred"
				  (cons (car a) args))
		 nil)
		(void-variable
                 (setq math-normalize-error t)
		 (if (eq (nth 1 err) 'var-EvalRules)
		     (progn
		       (setq var-EvalRules nil)
		       (math-normalize (cons (car a) args)))
		   (calc-record-why "*Variable is void" (nth 1 err)))))
	      (if (consp (car a))
		  (math-dimension-error)
		(cons (car a) args))))))))