[comp.sources.misc] v15i034: Patch for GNU Emacs Calc, version 1.04 -> 1.05, part 07/20

daveg@csvax.cs.caltech.edu (David Gillespie) (10/15/90)

Posting-number: Volume 15, Issue 34
Submitted-by: daveg@csvax.cs.caltech.edu (David Gillespie)
Archive-name: calc-1.05/part07

#!/bin/sh
# this is part 7 of a multipart archive
# do not concatenate these parts, unpack them in order with /bin/sh
# file calc.patch continued
#
CurArch=7
if test ! -r s2_seq_.tmp
then echo "Please unpack part 1 first!"
     exit 1; fi
( read Scheck
  if test "$Scheck" != $CurArch
  then echo "Please unpack part $Scheck next!"
       exit 1;
  else exit 0; fi
) < s2_seq_.tmp || exit 1
sed 's/^X//' << 'SHAR_EOF' >> calc.patch
X+ which correspond to zeros in mask are deleted.  The length of the
X+ result vector is the number of nonzero elements of the mask."
X+   (interactive "P")
X+   (calc-wrapper
X+    (calc-binary-op "vmsk" 'calcFunc-vmask arg))
X+ )
X+ 
X+ (defun calc-expand-vector (arg)
X+   "Expand a vector according to a mask vector.
X+ Vector is in top of stack, mask is in second-to-top.
X+ The result is a vector of the same length as mask.  Each nonzero element
X+ of mask is replaced by the next element of vec.  If vec has more elements
X+ than mask has nonzero elements, some are omitted.  If vec has fewer
X+ elements, the last few nonzero elements of mask are left the same.
X+ With Hyperbolic flag, top-of-stack is a filler element which is used
X+ instead of zero for zero mask elements; vector and mask are in stack
X+ levels two and three."
X+   (interactive "P")
X+   (calc-wrapper
X+    (if (calc-is-hyperbolic)
X+        (calc-enter-result 3 "vexp" (cons 'calcFunc-vexp (calc-top-list-n 3)))
X+      (calc-binary-op "vexp" 'calcFunc-vexp arg)))
X+ )
X+ 
X  (defun calc-sort ()
X    "Sort the matrix at top of stack into increasing order.
X! With Inverse flag, sort into decreasing order.
X! With Hyperbolic flag, return a permutation vector which would sort the input."
X    (interactive)
X    (calc-slow-wrapper
X     (if (calc-is-inverse)
X***************
X*** 4292,4297 ****
X--- 7907,7922 ----
X       (calc-enter-result 1 "sort" (list 'calcFunc-sort (calc-top-n 1)))))
X  )
X  
X+ (defun calc-grade ()
X+   "Grade the matrix at top of stack into increasing order.
X+ This produces a permutation vector which would sort the input."
X+   (interactive)
X+   (calc-slow-wrapper
X+    (if (calc-is-inverse)
X+        (calc-enter-result 1 "rgrd" (list 'calcFunc-rgrade (calc-top-n 1)))
X+      (calc-enter-result 1 "grad" (list 'calcFunc-grade (calc-top-n 1)))))
X+ )
X+ 
X  (defun calc-histogram (n)
X    "Compile a histogram of a vector of integers in the range [0..N).
X  N is the numeric prefix argument.
X***************
X*** 4375,4410 ****
X     (calc-unary-op "cnrm" 'calcFunc-cnorm arg))
X  )
X  
X! (defun calc-mrow (n)
X    "Replace matrix at top of stack with its Nth row.
X  Numeric prefix N must be between 1 and the height of the matrix.
X  If top of stack is a non-matrix vector, extract its Nth element.
X  If N is negative, remove the Nth row (or element)."
X!   (interactive "NRow number: ")
X    (calc-wrapper
X!    (setq n (prefix-numeric-value n))
X!    (if (= n 0)
X!        (calc-enter-result 1 "getd" (list 'calcFunc-getdiag (calc-top-n 1)))
X!      (if (< n 0)
X! 	 (calc-enter-result 1 "rrow" (list 'calcFunc-mrrow
X! 					   (calc-top-n 1) (- n)))
X!        (calc-enter-result 1 "mrow" (list 'calcFunc-mrow (calc-top-n 1) n)))))
X  )
X  
X! (defun calc-mcol (n)
X    "Replace matrix at top of stack with its Nth column.
X  Numeric prefix N must be between 1 and the width of the matrix.
X  If top of stack is a non-matrix vector, extract its Nth element.
X  If N is negative, remove the Nth column (or element)."
X!   (interactive "NColumn number: ")
X    (calc-wrapper
X!    (setq n (prefix-numeric-value n))
X!    (if (= n 0)
X!        (calc-enter-result 1 "getd" (list 'calcFunc-getdiag (calc-top-n 1)))
X!      (if (< n 0)
X! 	 (calc-enter-result 1 "rcol" (list 'calcFunc-mrcol
X! 					   (calc-top-n 1) (- n)))
X!        (calc-enter-result 1 "mcol" (list 'calcFunc-mcol (calc-top-n 1) n)))))
X  )
X  
X  ;;;; [calc-map.el]
X--- 8000,8041 ----
X     (calc-unary-op "cnrm" 'calcFunc-cnorm arg))
X  )
X  
X! (defun calc-mrow (n &optional nn)
X    "Replace matrix at top of stack with its Nth row.
X  Numeric prefix N must be between 1 and the height of the matrix.
X  If top of stack is a non-matrix vector, extract its Nth element.
X  If N is negative, remove the Nth row (or element)."
X!   (interactive "NRow number: \nP")
X    (calc-wrapper
X!    (if (consp nn)
X!        (calc-enter-result 2 "mrow" (cons 'calcFunc-mrow (calc-top-list-n 2)))
X!      (setq n (prefix-numeric-value n))
X!      (if (= n 0)
X! 	 (calc-enter-result 1 "getd" (list 'calcFunc-getdiag (calc-top-n 1)))
X!        (if (< n 0)
X! 	   (calc-enter-result 1 "rrow" (list 'calcFunc-mrrow
X! 					     (calc-top-n 1) (- n)))
X! 	 (calc-enter-result 1 "mrow" (list 'calcFunc-mrow
X! 					   (calc-top-n 1) n))))))
X  )
X  
X! (defun calc-mcol (n &optional nn)
X    "Replace matrix at top of stack with its Nth column.
X  Numeric prefix N must be between 1 and the width of the matrix.
X  If top of stack is a non-matrix vector, extract its Nth element.
X  If N is negative, remove the Nth column (or element)."
X!   (interactive "NColumn number: \nP")
X    (calc-wrapper
X!    (if (consp nn)
X!        (calc-enter-result 2 "mcol" (cons 'calcFunc-mcol (calc-top-list-n 2)))
X!      (setq n (prefix-numeric-value n))
X!      (if (= n 0)
X! 	 (calc-enter-result 1 "getd" (list 'calcFunc-getdiag (calc-top-n 1)))
X!        (if (< n 0)
X! 	   (calc-enter-result 1 "rcol" (list 'calcFunc-mrcol
X! 					     (calc-top-n 1) (- n)))
X! 	 (calc-enter-result 1 "mcol" (list 'calcFunc-mcol
X! 					   (calc-top-n 1) n))))))
X  )
X  
X  ;;;; [calc-map.el]
X***************
X*** 4414,4420 ****
X  For example, applying f to [1, 2, 3] produces f(1, 2, 3)."
X    (interactive)
X    (calc-wrapper
X!    (let* ((calc-dollar-values (mapcar 'car-safe
X  				      (nthcdr calc-stack-top calc-stack)))
X  	  (calc-dollar-used 0)
X  	  (oper (or oper (calc-get-operator "Apply"
X--- 8045,8052 ----
X  For example, applying f to [1, 2, 3] produces f(1, 2, 3)."
X    (interactive)
X    (calc-wrapper
X!    (let* ((sel-mode nil)
X! 	  (calc-dollar-values (mapcar 'calc-get-stack-element
X  				      (nthcdr calc-stack-top calc-stack)))
X  	  (calc-dollar-used 0)
X  	  (oper (or oper (calc-get-operator "Apply"
X***************
X*** 4433,4452 ****
X  
X  (defun calc-reduce (&optional oper)
X    "Apply a binary operator across all elements of a vector.
X! For example, applying + computes the sum of vector elements."
X    (interactive)
X    (calc-wrapper
X!    (let* ((calc-dollar-values (mapcar 'car-safe
X  				      (nthcdr calc-stack-top calc-stack)))
X  	  (calc-dollar-used 0)
X! 	  (oper (or oper (calc-get-operator "Reduce" 2))))
X       (message "Working...")
X       (calc-set-command-flag 'clear-message)
X       (calc-enter-result (1+ calc-dollar-used)
X! 			(concat (substring "red" 0 (- 4 (length (nth 2 oper))))
X  				(nth 2 oper))
X! 			(list (intern (concat "calcFunc-reduce"
X! 					      (or calc-mapping-dir "")))
X  			      (math-calcFunc-to-var (nth 1 oper))
X  			      (calc-top-n (1+ calc-dollar-used))))))
X  )
X--- 8065,8091 ----
X  
X  (defun calc-reduce (&optional oper)
X    "Apply a binary operator across all elements of a vector.
X! For example, applying + computes the sum of vector elements.
X! With Hyperbolic flag, accumulate intermediate results into a vector."
X    (interactive)
X    (calc-wrapper
X!    (let* ((sel-mode nil)
X! 	  (accum (calc-is-hyperbolic))
X! 	  (calc-dollar-values (mapcar 'calc-get-stack-element
X  				      (nthcdr calc-stack-top calc-stack)))
X  	  (calc-dollar-used 0)
X! 	  (oper (or oper (calc-get-operator (if accum "Accumulate" "Reduce")
X! 					    2))))
X       (message "Working...")
X       (calc-set-command-flag 'clear-message)
X       (calc-enter-result (1+ calc-dollar-used)
X! 			(concat (substring (if accum "acc" "red")
X! 					   0 (- 4 (length (nth 2 oper))))
X  				(nth 2 oper))
X! 			(list (if accum
X! 				  'calcFunc-accum
X! 				(intern (concat "calcFunc-reduce"
X! 						(or calc-mapping-dir ""))))
X  			      (math-calcFunc-to-var (nth 1 oper))
X  			      (calc-top-n (1+ calc-dollar-used))))))
X  )
X***************
X*** 4456,4462 ****
X  For example, applying * computes a vector of products."
X    (interactive)
X    (calc-wrapper
X!    (let* ((calc-dollar-values (mapcar 'car-safe
X  				      (nthcdr calc-stack-top calc-stack)))
X  	  (calc-dollar-used 0)
X  	  (oper (or oper (calc-get-operator "Map")))
X--- 8095,8102 ----
X  For example, applying * computes a vector of products."
X    (interactive)
X    (calc-wrapper
X!    (let* ((sel-mode nil)
X! 	  (calc-dollar-values (mapcar 'calc-get-stack-element
X  				      (nthcdr calc-stack-top calc-stack)))
X  	  (calc-dollar-used 0)
X  	  (oper (or oper (calc-get-operator "Map")))
X***************
X*** 4477,4493 ****
X  				     (1+ calc-dollar-used)))))))
X  )
X  
X  ;;; Return a list of the form (nargs func name)
X  (defun calc-get-operator (msg &optional nargs)
X    (let ((inv nil) (hyp nil) (prefix nil)
X  	done key oper (which 0)
X  	(msgs '( "(Press ? for help)"
X! 		 "+, -, *, /, ^, %, \\, :, !, |, Neg"
X  		 "SHIFT + Abs, conJ, arG; maX, miN; Floor, Round; sQrt"
X  		 "SHIFT + Inv, Hyp; Sin, Cos, Tan; Exp, Ln, logB"
X! 		 "Binary + And, Or, Xor, Diff; Not, Clip"
X  		 "Conversions + Deg, Rad, HMS; Float; SHIFT + Fraction"
X! 		 "Kombinatorics + Dfact, Lcm, Gcd, Binomial, Perms; Random"
X  		 "Matrix-dir + Elements, Rows, Cols, Across, Down"
X  		 "X or Z = any function by name; ' = alg entry; $ = stack")))
X      (while (not done)
X--- 8117,8181 ----
X  				     (1+ calc-dollar-used)))))))
X  )
X  
X+ (defun calc-outer-product (&optional oper)
X+   "Compute the generalized outer product of two vectors.
X+ For example, using * produces a multiplication table."
X+   (interactive)
X+   (calc-wrapper
X+    (let* ((sel-mode nil)
X+ 	  (calc-dollar-values (mapcar 'calc-get-stack-element
X+ 				      (nthcdr calc-stack-top calc-stack)))
X+ 	  (calc-dollar-used 0)
X+ 	  (oper (or oper (calc-get-operator "Outer" 2))))
X+      (message "Working...")
X+      (calc-set-command-flag 'clear-message)
X+      (calc-enter-result (+ 2 calc-dollar-used)
X+ 			(concat (substring "out" 0 (- 4 (length (nth 2 oper))))
X+ 				(nth 2 oper))
X+ 			(cons 'calcFunc-outer
X+ 			      (cons (math-calcFunc-to-var (nth 1 oper))
X+ 				    (calc-top-list-n
X+ 				     2 (1+ calc-dollar-used)))))))
X+ )
X+ 
X+ (defun calc-inner-product (&optional mul-oper add-oper)
X+   "Compute the generalized inner product of two vectors or matrices.
X+ You specify the multiplicative and additive operators or functions to use.
X+ For example, using * and + respectively does a matrix multiplication."
X+   (interactive)
X+   (calc-wrapper
X+    (let* ((sel-mode nil)
X+ 	  (calc-dollar-values (mapcar 'calc-get-stack-element
X+ 				      (nthcdr calc-stack-top calc-stack)))
X+ 	  (calc-dollar-used 0)
X+ 	  (mul-oper (or mul-oper (calc-get-operator "Inner (Mult)" 2)))
X+ 	  (add-oper (or add-oper (calc-get-operator "Inner (Add)" 2))))
X+      (message "Working...")
X+      (calc-set-command-flag 'clear-message)
X+      (calc-enter-result (+ 2 calc-dollar-used)
X+ 			(concat "in"
X+ 				(substring (nth 2 mul-oper) 0 1)
X+ 				(substring (nth 2 add-oper) 0 1))
X+ 			(nconc (list 'calcFunc-inner
X+ 				     (math-calcFunc-to-var (nth 1 mul-oper))
X+ 				     (math-calcFunc-to-var (nth 1 add-oper)))
X+ 			       (calc-top-list-n 2 (1+ calc-dollar-used))))))
X+ )
X+ 
X  ;;; Return a list of the form (nargs func name)
X  (defun calc-get-operator (msg &optional nargs)
X    (let ((inv nil) (hyp nil) (prefix nil)
X  	done key oper (which 0)
X  	(msgs '( "(Press ? for help)"
X! 		 "+, -, *, /, ^, %, \\, :, &, !, |, Neg"
X  		 "SHIFT + Abs, conJ, arG; maX, miN; Floor, Round; sQrt"
X  		 "SHIFT + Inv, Hyp; Sin, Cos, Tan; Exp, Ln, logB"
X! 		 "Algebra + Simp, Esimp, Deriv, Integ, !, =, etc."
X! 		 "Binary + And, Or, Xor, Diff; l/r/t/L/R shifts; Not, Clip"
X  		 "Conversions + Deg, Rad, HMS; Float; SHIFT + Fraction"
X! 		 "Functions + Re, Im; Hypot; Mant, Expon, Scale; etc."
X! 		 "Kombinatorics + Dfact, Lcm, Gcd, Choose; Random; etc."
X! 		 "Vectors + Length, Row, Col, Diag, Mask, etc."
X  		 "Matrix-dir + Elements, Rows, Cols, Across, Down"
X  		 "X or Z = any function by name; ' = alg entry; $ = stack")))
X      (while (not done)
X***************
X*** 4506,4522 ****
X  	     (keyboard-quit))
X  	    ((= key ??)
X  	     (setq which (% (1+ which) (length msgs))))
X! 	    ((= key ?I)
X! 	     (setq inv (not inv)
X! 		   prefix nil))
X! 	    ((= key ?H)
X! 	     (setq hyp (not hyp)
X! 		   prefix nil))
X  	    ((eq key prefix)
X  	     (setq prefix nil))
X! 	    ((and (memq key '(?b ?c ?k ?m)) (null prefix))
X! 	     (setq inv nil hyp nil
X! 		   prefix key))
X  	    ((eq prefix ?m)
X  	     (setq prefix nil)
X  	     (if (eq key ?e)
X--- 8194,8207 ----
X  	     (keyboard-quit))
X  	    ((= key ??)
X  	     (setq which (% (1+ which) (length msgs))))
X! 	    ((and (= key ?I) (null prefix))
X! 	     (setq inv (not inv)))
X! 	    ((and (= key ?H) (null prefix))
X! 	     (setq hyp (not hyp)))
X  	    ((eq key prefix)
X  	     (setq prefix nil))
X! 	    ((and (memq key '(?a ?b ?c ?f ?k ?m ?v ?V)) (null prefix))
X! 	     (setq prefix (downcase key)))
X  	    ((eq prefix ?m)
X  	     (setq prefix nil)
X  	     (if (eq key ?e)
X***************
X*** 4562,4576 ****
X  					   arglist)
X  					  expr))
X  		       done t))))
X! 	    ((setq oper (assq key (cond ((eq prefix ?b) calc-b-oper-keys)
X! 					((eq prefix ?c) calc-c-oper-keys)
X! 					((eq prefix ?k) calc-k-oper-keys)
X! 					(inv (if hyp
X! 						 calc-inv-hyp-oper-keys
X! 					       calc-inv-oper-keys))
X! 					(t (if hyp
X! 					       calc-hyp-oper-keys
X! 					     calc-oper-keys)))))
X  	     (if (eq (nth 1 oper) 'user)
X  		 (let ((func (intern
X  			      (completing-read "Function name: "
X--- 8247,8260 ----
X  					   arglist)
X  					  expr))
X  		       done t))))
X! 	    ((setq oper (assq key (nth (if inv (if hyp 3 1) (if hyp 2 0))
X! 				       (cond ((eq prefix ?a) calc-a-oper-keys)
X! 					     ((eq prefix ?b) calc-b-oper-keys)
X! 					     ((eq prefix ?c) calc-c-oper-keys)
X! 					     ((eq prefix ?f) calc-f-oper-keys)
X! 					     ((eq prefix ?k) calc-k-oper-keys)
X! 					     ((eq prefix ?v) calc-v-oper-keys)
X! 					     (t calc-oper-keys)))))
X  	     (if (eq (nth 1 oper) 'user)
X  		 (let ((func (intern
X  			      (completing-read "Function name: "
X***************
X*** 4612,4703 ****
X  	 (error "Must be a %d-argument operator" nargs))
X      (append (cdr oper)
X  	    (list
X! 	     (concat (if prefix (char-to-string prefix) "")
X! 		     (if inv "I" "") (if hyp "H" "")
X! 		     (char-to-string key)))))
X! )
X! 
X! (defconst calc-oper-keys '( ( ?+ 2 calcFunc-add )
X! 			    ( ?- 2 calcFunc-sub )
X! 			    ( ?* 2 calcFunc-mul )
X! 			    ( ?/ 2 calcFunc-div )
X! 			    ( ?^ 2 calcFunc-pow )
X! 			    ( ?| 2 calcFunc-vconcat )
X! 			    ( ?% 2 calcFunc-mod )
X! 			    ( ?\\ 2 calcFunc-idiv )
X! 			    ( ?: 2 calcFunc-fdiv )
X! 			    ( ?! 1 calcFunc-fact )
X! 			    ( ?n 1 calcFunc-neg )
X! 			    ( ?x user )
X! 			    ( ?z user )
X! 			    ( ?A 1 calcFunc-abs )
X! 			    ( ?J 1 calcFunc-conj )
X! 			    ( ?G 1 calcFunc-arg )
X! 			    ( ?Q 1 calcFunc-sqrt )
X! 			    ( ?N 2 calcFunc-min )
X! 			    ( ?X 2 calcFunc-max )
X! 			    ( ?F 1 calcFunc-floor )
X! 			    ( ?R 1 calcFunc-round )
X! 			    ( ?S 1 calcFunc-sin )
X! 			    ( ?C 1 calcFunc-cos )
X! 			    ( ?T 1 calcFunc-tan )
X! 			    ( ?L 1 calcFunc-ln )
X! 			    ( ?E 1 calcFunc-exp )
X! 			    ( ?B 2 calcFunc-log )
X! ))
X! (defconst calc-b-oper-keys '( ( ?a 2 calcFunc-and )
X! 			      ( ?o 2 calcFunc-or )
X! 			      ( ?x 2 calcFunc-xor )
X! 			      ( ?d 2 calcFunc-diff )
X! 			      ( ?n 1 calcFunc-not )
X! 			      ( ?c 1 calcFunc-clip )
X! 			      ( ?l 2 calcFunc-lsh )
X! 			      ( ?r 2 calcFunc-rsh )
X! 			      ( ?L 2 calcFunc-ash )
X! 			      ( ?R 2 calcFunc-rash )
X! 			      ( ?t 2 calcFunc-rot )
X! ))
X! (defconst calc-c-oper-keys '( ( ?d 1 calcFunc-deg )
X! 			      ( ?r 1 calcFunc-rad )
X! 			      ( ?h 1 calcFunc-hms )
X! 			      ( ?f 1 calcFunc-float )
X! 			      ( ?F 1 calcFunc-frac )
X! ))
X! (defconst calc-k-oper-keys '( ( ?g 2 calcFunc-gcd )
X! 			      ( ?l 2 calcFunc-lcm )
X! 			      ( ?b 2 calcFunc-choose )
X! 			      ( ?d 1 calcFunc-dfact )
X! 			      ( ?m 1 calcFunc-moebius )
X! 			      ( ?p 2 calcFunc-perm )
X! 			      ( ?r 1 calcFunc-random )
X! 			      ( ?t 1 calcFunc-totient )
X! ))
X! (defconst calc-inv-oper-keys '( ( ?F 1 calcFunc-ceil )
X! 				( ?R 1 calcFunc-trunc )
X! 				( ?Q 1 calcFunc-sqr )
X! 				( ?S 1 calcFunc-arcsin )
X! 				( ?C 1 calcFunc-arccos )
X! 				( ?T 1 calcFunc-arctan )
X! 				( ?L 1 calcFunc-exp )
X! 				( ?E 1 calcFunc-ln )
X! ))
X! (defconst calc-hyp-oper-keys '( ( ?F 1 calcFunc-ffloor )
X! 				( ?R 1 calcFunc-fround )
X! 				( ?S 1 calcFunc-sinh )
X! 				( ?C 1 calcFunc-cosh )
X! 				( ?T 1 calcFunc-tanh )
X! 				( ?L 1 calcFunc-log10 )
X! 				( ?E 1 calcFunc-exp10 )
X! ))
X! (defconst calc-inv-hyp-oper-keys '( ( ?F 1 calcFunc-fceil )
X! 				    ( ?R 1 calcFunc-ftrunc )
X! 				    ( ?S 1 calcFunc-arcsinh )
X! 				    ( ?C 1 calcFunc-arccosh )
X! 				    ( ?T 1 calcFunc-arctanh )
X! 				    ( ?L 1 calcFunc-exp10 )
X! 				    ( ?E 1 calcFunc-log10 )
X! ))
X! 
X  
X  
X  
X--- 8296,8488 ----
X  	 (error "Must be a %d-argument operator" nargs))
X      (append (cdr oper)
X  	    (list
X! 	     (let ((name (concat (if inv "I" "") (if hyp "H" "")
X! 				 (if prefix (char-to-string prefix) "")
X! 				 (char-to-string key))))
X! 	       (if (> (length name) 3)
X! 		   (substring name 0 3)
X! 		 name)))))
X! )
X! 
X! (defconst calc-oper-keys '( ( ( ?+ 2 calcFunc-add )
X! 			      ( ?- 2 calcFunc-sub )
X! 			      ( ?* 2 calcFunc-mul )
X! 			      ( ?/ 2 calcFunc-div )
X! 			      ( ?^ 2 calcFunc-pow )
X! 			      ( ?| 2 calcFunc-vconcat )
X! 			      ( ?% 2 calcFunc-mod )
X! 			      ( ?\\ 2 calcFunc-idiv )
X! 			      ( ?: 2 calcFunc-fdiv )
X! 			      ( ?! 1 calcFunc-fact )
X! 			      ( ?& 1 calcFunc-inv )
X! 			      ( ?n 1 calcFunc-neg )
X! 			      ( ?x user )
X! 			      ( ?z user )
X! 			      ( ?A 1 calcFunc-abs )
X! 			      ( ?J 1 calcFunc-conj )
X! 			      ( ?G 1 calcFunc-arg )
X! 			      ( ?Q 1 calcFunc-sqrt )
X! 			      ( ?N 2 calcFunc-min )
X! 			      ( ?X 2 calcFunc-max )
X! 			      ( ?F 1 calcFunc-floor )
X! 			      ( ?R 1 calcFunc-round )
X! 			      ( ?S 1 calcFunc-sin )
X! 			      ( ?C 1 calcFunc-cos )
X! 			      ( ?T 1 calcFunc-tan )
X! 			      ( ?L 1 calcFunc-ln )
X! 			      ( ?E 1 calcFunc-exp )
X! 			      ( ?B 2 calcFunc-log ) )
X! 			    ( ( ?F 1 calcFunc-ceil )     ; inverse
X! 			      ( ?R 1 calcFunc-trunc )
X! 			      ( ?Q 1 calcFunc-sqr )
X! 			      ( ?S 1 calcFunc-arcsin )
X! 			      ( ?C 1 calcFunc-arccos )
X! 			      ( ?T 1 calcFunc-arctan )
X! 			      ( ?L 1 calcFunc-exp )
X! 			      ( ?E 1 calcFunc-ln )
X! 			      ( ?B 2 calcFunc-alog )
X! 			      ( ?^ 2 calcFunc-nroot ) )
X! 			    ( ( ?F 1 calcFunc-ffloor )   ; hyperbolic
X! 			      ( ?R 1 calcFunc-fround )
X! 			      ( ?S 1 calcFunc-sinh )
X! 			      ( ?C 1 calcFunc-cosh )
X! 			      ( ?T 1 calcFunc-tanh )
X! 			      ( ?L 1 calcFunc-log10 )
X! 			      ( ?E 1 calcFunc-exp10 ) )
X! 			    ( ( ?F 1 calcFunc-fceil )    ; inverse-hyperbolic
X! 			      ( ?R 1 calcFunc-ftrunc )
X! 			      ( ?S 1 calcFunc-arcsinh )
X! 			      ( ?C 1 calcFunc-arccosh )
X! 			      ( ?T 1 calcFunc-arctanh )
X! 			      ( ?L 1 calcFunc-exp10 )
X! 			      ( ?E 1 calcFunc-log10 ) )
X! ))
X! (defconst calc-a-oper-keys '( ( ( ?s 1 calcFunc-simplify )
X! 				( ?e 1 calcFunc-esimplify )
X! 				( ?d 2 calcFunc-deriv )
X! 				( ?i 2 calcFunc-integ )
X! 				( ?S 2 calcFunc-solve )
X! 				( ?= 2 calcFunc-eq )
X! 				( ?\# 2 calcFunc-neq )
X! 				( ?< 2 calcFunc-lt )
X! 				( ?> 2 calcFunc-gt )
X! 				( ?\[ 2 calcFunc-leq )
X! 				( ?\] 2 calcFunc-geq )
X! 				( ?{ 2 calcFunc-in )
X! 				( ?! 1 calcFunc-lnot )
X! 				( ?& 2 calcFunc-land )
X! 				( ?\| 2 calcFunc-lor )
X! 				( ?: 3 calcFunc-if ) )
X! 			      ( ( ?S 2 calcFunc-finv ) )
X! 			      ( ( ?S 2 calcFunc-fsolve ) )
X! 			      ( ( ?S 2 calcFunc-ffinv ) )
X! ))
X! (defconst calc-b-oper-keys '( ( ( ?a 2 calcFunc-and )
X! 				( ?o 2 calcFunc-or )
X! 				( ?x 2 calcFunc-xor )
X! 				( ?d 2 calcFunc-diff )
X! 				( ?n 1 calcFunc-not )
X! 				( ?c 1 calcFunc-clip )
X! 				( ?l 2 calcFunc-lsh )
X! 				( ?r 2 calcFunc-rsh )
X! 				( ?L 2 calcFunc-ash )
X! 				( ?R 2 calcFunc-rash )
X! 				( ?t 2 calcFunc-rot ) )
X! ))
X! (defconst calc-c-oper-keys '( ( ( ?d 1 calcFunc-deg )
X! 				( ?r 1 calcFunc-rad )
X! 				( ?h 1 calcFunc-hms )
X! 				( ?f 1 calcFunc-float )
X! 				( ?F 1 calcFunc-frac ) )
X! ))
X! (defconst calc-f-oper-keys '( ( ( ?b 2 calcFunc-beta )
X! 				( ?e 1 calcFunc-erf )
X! 				( ?g 1 calcFunc-gamma )
X! 				( ?h 2 calcFunc-hypot )
X! 				( ?i 1 calcFunc-im )
X! 				( ?j 2 calcFunc-besJ )
X! 				( ?n 2 calcFunc-min )
X! 				( ?r 1 calcFunc-re )
X! 				( ?s 1 calcFunc-sign )
X! 				( ?x 2 calcFunc-max )
X! 				( ?y 2 calcFunc-besY )
X! 				( ?A 1 calcFunc-abssqr )
X! 				( ?B 3 calcFunc-betaI )
X! 				( ?E 1 calcFunc-expm1 )
X! 				( ?G 2 calcFunc-gammaP )
X! 				( ?I 2 calcFunc-ilog )
X! 				( ?L 1 calcFunc-lnp1 )
X! 				( ?M 1 calcFunc-mant )
X! 				( ?Q 1 calcFunc-isqrt )
X! 				( ?S 1 calcFunc-scf )
X! 				( ?T 2 calcFunc-arctan2 )
X! 				( ?X 1 calcFunc-xpon )
X! 				( ?\[ 2 calcFunc-decr )
X! 				( ?\] 2 calcFunc-incr ) )
X! 			      ( ( ?e 1 calcFunc-erfc )
X! 				( ?E 1 calcFunc-lnp1 )
X! 				( ?G 2 calcFunc-gammaQ )
X! 				( ?L 1 calcFunc-expm1 ) )
X! 			      ( ( ?B 3 calcFunc-betaB )
X! 				( ?G 2 calcFunc-gammag) )
X! 			      ( ( ?G 2 calcFunc-gammaG ) )
X! ))
X! (defconst calc-k-oper-keys '( ( ( ?b 1 calcFunc-bern )
X! 				( ?c 2 calcFunc-choose )
X! 				( ?d 1 calcFunc-dfact )
X! 				( ?e 1 calcFunc-euler )
X! 				( ?f 1 calcFunc-prfac )
X! 				( ?g 2 calcFunc-gcd )
X! 				( ?h 2 calcFunc-shuffle )
X! 				( ?l 2 calcFunc-lcm )
X! 				( ?m 1 calcFunc-moebius )
X! 				( ?n 1 calcFunc-nextprime )
X! 				( ?r 1 calcFunc-random )
X! 				( ?s 2 calcFunc-stir1 )
X! 				( ?t 1 calcFunc-totient )
X! 				( ?B 3 calcFunc-utpb )
X! 				( ?C 2 calcFunc-utpc )
X! 				( ?F 3 calcFunc-utpf )
X! 				( ?N 3 calcFunc-utpn )
X! 				( ?P 2 calcFunc-utpp )
X! 				( ?T 2 calcFunc-utpt ) )
X! 			      ( ( ?n 1 calcFunc-prevprime )
X! 				( ?B 3 calcFunc-ltpb )
X! 				( ?C 2 calcFunc-ltpc )
X! 				( ?F 3 calcFunc-ltpf )
X! 				( ?N 3 calcFunc-ltpn )
X! 				( ?P 2 calcFunc-ltpp )
X! 				( ?T 2 calcFunc-ltpt ) )
X! 			      ( ( ?b 2 calcFunc-bern )
X! 				( ?c 2 calcFunc-perm )
X! 				( ?e 2 calcFunc-euler )
X! 				( ?s 2 calcFunc-stir2 ) )
X! ))
X! (defconst calc-v-oper-keys '( ( ( ?a 2 calcFunc-arrange )
X! 				( ?b 2 calcFunc-cvec )
X! 				( ?c 2 calcFunc-mcol )
X! 				( ?d 2 calcFunc-diag )
X! 				( ?e 2 calcFunc-vexp )
X! 				( ?f 2 calcFunc-find )
X! 				( ?l 1 calcFunc-vlen )
X! 				( ?m 2 calcFunc-vmask )
X! 				( ?n 1 calcFunc-rnorm )
X! 				( ?r 2 calcFunc-mrow )
X! 				( ?s 3 calcFunc-subvec )
X! 				( ?t 1 calcFunc-trn )
X! 				( ?x 1 calcFunc-index )
X! 				( ?D 1 calcFunc-det )
X! 				( ?C 1 calcFunc-cross )
X! 				( ?G 1 calcFunc-grade )
X! 				( ?H 2 calcFunc-histogram )
X! 				( ?N 1 calcFunc-cnorm )
X! 				( ?S 1 calcFunc-sort )
X! 				( ?T 1 calcFunc-tr ) )
X! 			      ( ( ?G 1 calcFunc-rgrade )
X! 				( ?S 1 calcFunc-rsort ) )
X! 			      ( ( ?e 3 calcFunc-vexp )
X! 				( ?H 3 calcFunc-histogram ) )
X! ))
X  
X  
X  
X***************
X*** 4918,4923 ****
X--- 8703,8709 ----
X  			 "Leave it symbolic for non-constant arguments? ")))
X       (if cmd
X  	 (progn
X+ 	   (calc-need-macros)
X  	   (fset cmd
X  		 (list 'lambda
X  		       '()
X***************
X*** 4959,4965 ****
X    (if (consp form)
X        (if (eq (car form) 'var)
X  	  (if (or (memq (nth 1 form) arglist)
X! 		  (boundp (nth 2 form)))
X  	      ()
X  	    (setq arglist (cons (nth 1 form) arglist)))
X  	(calc-default-formula-arglist-step (cdr form))))
X--- 8745,8751 ----
X    (if (consp form)
X        (if (eq (car form) 'var)
X  	  (if (or (memq (nth 1 form) arglist)
X! 		  (calc-var-value (nth 2 form)))
X  	      ()
X  	    (setq arglist (cons (nth 1 form) arglist)))
X  	(calc-default-formula-arglist-step (cdr form))))
X***************
X*** 5030,5036 ****
X  			'(arg)
X  			'(interactive "P")
X  			(list 'calc-execute-kbd-macro
X! 			      last-kbd-macro
X  			      'arg))))
X        (let* ((kmap (calc-user-key-map))
X  	     (old (assq key kmap)))
X--- 8816,8823 ----
X  			'(arg)
X  			'(interactive "P")
X  			(list 'calc-execute-kbd-macro
X! 			      (vector (key-description last-kbd-macro)
X! 				      last-kbd-macro)
X  			      'arg))))
X        (let* ((kmap (calc-user-key-map))
X  	     (old (assq key kmap)))
X***************
X*** 5075,5095 ****
X  				  (lambda (cmd)
X  				    (if (stringp (symbol-function cmd))
X  					(symbol-function cmd)
X! 				      (nth 1 (nth 3 (symbol-function cmd))))))
X  				 (function
X  				  (lambda (new cmd)
X  				    (if (stringp (symbol-function cmd))
X  					(fset cmd new)
X! 				      (setcar (cdr (nth 3 (symbol-function
X! 							   cmd)))
X! 					      new))))))
X! 	     (calc-wrapper
X! 	      (calc-edit-mode (list 'calc-finish-macro-edit
X! 				    (list 'quote def)))
X! 	      (insert (if (stringp cmd)
X! 			  cmd
X! 			(nth 1 (nth 3 cmd)))))
X! 	     (calc-show-edit-buffer)))
X  	  (t (let* ((func (calc-stack-command-p cmd))
X  		    (defn (and func
X  			       (symbolp func)
X--- 8862,8919 ----
X  				  (lambda (cmd)
X  				    (if (stringp (symbol-function cmd))
X  					(symbol-function cmd)
X! 				      (let ((mac (nth 1 (nth 3 (symbol-function
X! 								cmd)))))
X! 					(if (vectorp mac)
X! 					    (aref mac 1)
X! 					  mac)))))
X  				 (function
X  				  (lambda (new cmd)
X  				    (if (stringp (symbol-function cmd))
X  					(fset cmd new)
X! 				      (let ((mac (cdr (nth 3 (symbol-function
X! 							      cmd)))))
X! 					(if (vectorp (car mac))
X! 					    (progn
X! 					      (aset (car mac) 0
X! 						    (key-description new))
X! 					      (aset (car mac) 1 new))
X! 					  (setcar mac new))))))))
X! 	     (let ((keys (progn (and (fboundp 'edit-kbd-macro)
X! 				     (edit-kbd-macro nil))
X! 				(fboundp 'MacEdit-parse-keys))))
X! 	       (calc-wrapper
X! 		(calc-edit-mode (list 'calc-finish-macro-edit
X! 				      (list 'quote def)
X! 				      keys)
X! 				t)
X! 		(if keys
X! 		    (let (top
X! 			  (fill-column 70)
X! 			  (fill-prefix nil))
X! 		      (insert "Notations: RET, SPC, TAB, DEL, LFD, NUL"
X! 			      ", C-xxx, M-xxx.\n\n")
X! 		      (setq top (point))
X! 		      (insert (if (stringp cmd)
X! 				  (key-description cmd)
X! 				(if (vectorp (nth 1 (nth 3 cmd)))
X! 				    (aref (nth 1 (nth 3 cmd)) 0)
X! 				  (key-description (nth 1 (nth 3 cmd)))))
X! 			      "\n")
X! 		      (if (>= (prog2 (forward-char -1)
X! 				     (current-column)
X! 				     (forward-char 1))
X! 			      (screen-width))
X! 			  (fill-region top (point))))
X! 		  (insert "Press C-q to quote control characters like RET"
X! 			  " and TAB.\n"
X! 			  (if (stringp cmd)
X! 			      cmd
X! 			    (if (vectorp (nth 1 (nth 3 cmd)))
X! 				(aref (nth 1 (nth 3 cmd)) 1)
X! 			      (nth 1 (nth 3 cmd)))))))
X! 	       (calc-show-edit-buffer)
X! 	       (forward-line (if keys 2 1)))))
X  	  (t (let* ((func (calc-stack-command-p cmd))
X  		    (defn (and func
X  			       (symbolp func)
X***************
X*** 5099,5115 ****
X  		     (calc-wrapper
X  		      (calc-edit-mode (list 'calc-finish-formula-edit
X  					    (list 'quote func)))
X! 		      (insert (math-format-flat-expr defn 0) "\n"))
X  		     (calc-show-edit-buffer))
X  		 (error "That command's definition cannot be edited"))))))
X  )
X  
X! (defun calc-finish-macro-edit (def)
X!   (let ((str (buffer-substring (point) (point-max))))
X      (if (symbolp (cdr def))
X  	(if (stringp (symbol-function (cdr def)))
X  	    (fset (cdr def) str)
X! 	  (setcar (cdr (nth 3 (symbol-function (cdr def)))) str))
X        (setcdr def str)))
X  )
X  
X--- 8923,8949 ----
X  		     (calc-wrapper
X  		      (calc-edit-mode (list 'calc-finish-formula-edit
X  					    (list 'quote func)))
X! 		      (insert (math-format-nice-expr defn (screen-width))
X! 			      "\n"))
X  		     (calc-show-edit-buffer))
X  		 (error "That command's definition cannot be edited"))))))
X  )
X  
X! (defun calc-finish-macro-edit (def keys)
X!   (forward-line 1)
X!   (if (and keys (looking-at "\n")) (forward-line 1))
X!   (let* ((true-str (buffer-substring (point) (point-max)))
X! 	 (str true-str))
X!     (if keys (setq str (MacEdit-parse-keys str)))
X      (if (symbolp (cdr def))
X  	(if (stringp (symbol-function (cdr def)))
X  	    (fset (cdr def) str)
X! 	  (let ((mac (cdr (nth 3 (symbol-function (cdr def))))))
X! 	    (if (vectorp (car mac))
X! 		(progn
X! 		  (aset (car mac) 0 (if keys true-str (key-description str)))
X! 		  (aset (car mac) 1 str))
X! 	      (setcar mac str))))
X        (setcdr def str)))
X  )
X  
X***************
X*** 5191,5197 ****
X  	  (insert "\"\n"))))
X  )
X  (put 'calc-algebraic-entry 'MacEdit-print 'calc-macro-edit-algebraic)
X- (put 'calc-dollar-sign 'MacEdit-print 'calc-macro-edit-algebraic)
X  
X  (defun calc-macro-edit-variable ()
X    (let ((str "") ch)
X--- 9025,9030 ----
X***************
X*** 5285,5300 ****
X       (let* ((cmd (cdr def))
X  	    (fcmd (and cmd (symbolp cmd) (symbol-function cmd)))
X  	    (pt (point))
X! 	    (fill-column 70))
X         (if (and fcmd
X  		(eq (car-safe fcmd) 'lambda)
X  		(get cmd 'calc-user-defn))
X  	   (progn
X! 	     (insert (prin1-to-string
X! 		      (cons 'defun (cons cmd (cdr fcmd))))
X  		     "\n")
X! 	     (fill-region pt (point))
X! 	     (indent-rigidly pt (point) 3)
X  	     (delete-region pt (1+ pt))
X  	     (let* ((func (calc-stack-command-p cmd))
X  		    (ffunc (and func (symbolp func) (symbol-function func)))
X--- 9118,9143 ----
X       (let* ((cmd (cdr def))
X  	    (fcmd (and cmd (symbolp cmd) (symbol-function cmd)))
X  	    (pt (point))
X! 	    (fill-column 70)
X! 	    (fill-prefix nil)
X! 	    str q-ok)
X         (if (and fcmd
X  		(eq (car-safe fcmd) 'lambda)
X  		(get cmd 'calc-user-defn))
X  	   (progn
X! 	     (and (eq (car-safe (nth 3 fcmd)) 'calc-execute-kbd-macro)
X! 		  (vectorp (nth 1 (nth 3 fcmd)))
X! 		  (progn (and (fboundp 'edit-kbd-macro)
X! 			      (edit-kbd-macro nil))
X! 			 (fboundp 'MacEdit-parse-keys))
X! 		  (setq q-ok t)
X! 		  (aset (nth 1 (nth 3 fcmd)) 1 nil))
X! 	     (insert (setq str (prin1-to-string
X! 				(cons 'defun (cons cmd (cdr fcmd)))))
X  		     "\n")
X! 	     (or (and (string-match "\"" str) (not q-ok))
X! 		 (progn (fill-region pt (point))
X! 			(indent-rigidly pt (point) 3)))
X  	     (delete-region pt (1+ pt))
X  	     (let* ((func (calc-stack-command-p cmd))
X  		    (ffunc (and func (symbolp func) (symbol-function func)))
X***************
X*** 5303,5313 ****
X  		    (eq (car-safe ffunc) 'lambda)
X  		    (get func 'calc-user-defn)
X  		    (progn
X! 		      (insert (prin1-to-string
X! 			       (cons 'defun (cons func (cdr ffunc))))
X  			      "\n")
X! 		      (fill-region pt (point))
X! 		      (indent-rigidly pt (point) 3)
X  		      (delete-region pt (1+ pt))))))
X  	 (and (stringp fcmd)
X  	      (insert "  (fset '" (prin1-to-string cmd)
X--- 9146,9158 ----
X  		    (eq (car-safe ffunc) 'lambda)
X  		    (get func 'calc-user-defn)
X  		    (progn
X! 		      (insert (setq str (prin1-to-string
X! 					 (cons 'defun (cons func
X! 							    (cdr ffunc)))))
X  			      "\n")
X! 		      (or (and (string-match "\"" str) (not q-ok))
X! 			  (progn (fill-region pt (point))
X! 				 (indent-rigidly pt (point) 3)))
X  		      (delete-region pt (1+ pt))))))
X  	 (and (stringp fcmd)
X  	      (insert "  (fset '" (prin1-to-string cmd)
X***************
X*** 5356,5363 ****
X  	 (mapatoms (function
X  		    (lambda (x)
X  		      (and (string-match "\\`var-" (symbol-name x))
X! 			   (boundp x)
X! 			   (symbol-value x)
X  			   (not (eq (car-safe (symbol-value x))
X  				    'special-const))
X  			   (calc-insert-permanent-variable x)))))
X--- 9201,9207 ----
X  	 (mapatoms (function
X  		    (lambda (x)
X  		      (and (string-match "\\`var-" (symbol-name x))
X! 			   (calc-var-value x)
X  			   (not (eq (car-safe (symbol-value x))
X  				    'special-const))
X  			   (calc-insert-permanent-variable x)))))
X***************
X*** 5388,5394 ****
X  	    (symbol-name var)
X  	    " ')\n")
X      (backward-char 2))
X!   (insert (prin1-to-string (symbol-value var)))
X    (forward-line 1)
X  )
X  
X--- 9232,9238 ----
X  	    (symbol-name var)
X  	    " ')\n")
X      (backward-char 2))
X!   (insert (prin1-to-string (calc-var-value var)))
X    (forward-line 1)
X  )
X  
X***************
X*** 5401,5408 ****
X      (mapatoms (function
X  	       (lambda (x)
X  		 (and (string-match "\\`var-" (symbol-name x))
X! 		      (boundp x)
X! 		      (symbol-value x)
X  		      (not (eq (car-safe (symbol-value x)) 'special-const))
X  		      (insert "(setq "
X  			      (symbol-name x)
X--- 9245,9251 ----
X      (mapatoms (function
X  	       (lambda (x)
X  		 (and (string-match "\\`var-" (symbol-name x))
X! 		      (calc-var-value x)
X  		      (not (eq (car-safe (symbol-value x)) 'special-const))
X  		      (insert "(setq "
X  			      (symbol-name x)
X***************
X*** 5426,5431 ****
X--- 9269,9279 ----
X  )
X  
X  (defun calc-execute-kbd-macro (mac arg)
X+   (if (vectorp mac)
X+       (setq mac (or (aref mac 1)
X+ 		    (aset mac 1 (progn (and (fboundp 'edit-kbd-macro)
X+ 					    (edit-kbd-macro nil))
X+ 				       (MacEdit-parse-keys (aref mac 0)))))))
X    (if (< (prefix-numeric-value arg) 0)
X        (execute-kbd-macro mac (- (prefix-numeric-value arg)))
X      (if calc-executing-macro
X***************
X*** 5458,5467 ****
X  		   (delete-region (point) (point-max))
X  		   (while new-stack
X  		     (calc-record-undo (list 'push 1))
X! 		     (let ((fmt (math-format-stack-value
X! 				 (car (car new-stack)))))
X! 		       (setcar (cdr (car new-stack)) (calc-count-lines fmt))
X! 		       (insert fmt "\n"))
X  		     (setq new-stack (cdr new-stack)))
X  		   (calc-renumber-stack))
X  	       (while new-stack
X--- 9306,9312 ----
X  		   (delete-region (point) (point-max))
X  		   (while new-stack
X  		     (calc-record-undo (list 'push 1))
X! 		     (insert (math-format-stack-value (car new-stack)) "\n")
X  		     (setq new-stack (cdr new-stack)))
X  		   (calc-renumber-stack))
X  	       (while new-stack
X***************
X*** 5471,5476 ****
X--- 9316,9337 ----
X  	     (calc-record-undo (list 'set 'saved-stack-top 0))))))))
X  )
X  
X+ (defun calc-push-list-in-macro (vals m sels)
X+   (let ((entry (list (car vals) 1 (car sels)))
X+ 	(mm (+ (or m 1) calc-stack-top)))
X+     (if (> mm 1)
X+ 	(setcdr (nthcdr (- mm 2) calc-stack)
X+ 		(cons entry (nthcdr (1- mm) calc-stack)))
X+       (setq calc-stack (cons entry calc-stack))))
X+ )
X+ 
X+ (defun calc-pop-stack-in-macro (n mm)
X+   (if (> mm 1)
X+       (setcdr (nthcdr (- mm 2) calc-stack)
X+ 	      (nthcdr (+ n mm -1) calc-stack))
X+     (setq calc-stack (nthcdr n calc-stack)))
X+ )
X+ 
X  
X  (defun calc-kbd-if ()
X    "An \"if\" statement in a Calc keyboard macro.
X***************
X*** 5678,5684 ****
X  )
X  
X  (defun calc-kbd-break ()
X!   "Break out of a keyboard macro, or out of a Z< Z> or Z{ Z} loop in a macro.
X  Usage:  cond  Z/    breaks only if cond is true.  Use \"1 Z/\" to break always."
X    (interactive)
X    (calc-wrapper
X--- 9539,9545 ----
X  )
X  
X  (defun calc-kbd-break ()
X!   "Break out of a keyboard macro, or out of a Z< Z>, Z{ Z}, or Z( Z) loop.
X  Usage:  cond  Z/    breaks only if cond is true.  Use \"1 Z/\" to break always."
X    (interactive)
X    (calc-wrapper
X***************
X*** 5714,5719 ****
X--- 9575,9581 ----
X  	  (calc-simplify-mode calc-simplify-mode)
X  	  (calc-mapping-dir calc-mapping-dir)
X  	  (calc-algebraic-mode calc-algebraic-mode)
X+ 	  (calc-incomplete-algebraic-mode calc-incomplete-algebraic-mode)
X  	  (calc-symbolic-mode calc-symbolic-mode)
X  	  (calc-prefer-frac calc-prefer-frac)
X  	  (calc-complex-mode calc-complex-mode)
X***************
X*** 5849,5854 ****
X--- 9711,9725 ----
X  (math-defcache math-pi-over-180 nil
X    (math-div-float (math-pi) '(float 18 1)))
X  
X+ (math-defcache math-sqrt-pi nil
X+   (math-sqrt-float (math-pi)))
X+ 
X+ (math-defcache math-sqrt-2 nil
X+   (math-sqrt-float '(float 2 0)))
X+ 
X+ (math-defcache math-sqrt-two-pi nil
X+   (math-sqrt-float (math-two-pi)))
X+ 
X  (math-defcache math-sqrt-e (float (bigpos 849 146 128 700 270 721 648 1) -21)
X    (math-add-float '(float 1 0) (math-exp-minus-1-raw '(float 5 -1))))
X  
X***************
X*** 5885,5890 ****
X--- 9756,9822 ----
X      (/= (% a 2) 0))
X  )
X  
X+ ;;; True if A is a small or big integer.  [P x] [Public]
X+ (defun math-integerp (a)
X+   (or (integerp a)
X+       (memq (car-safe a) '(bigpos bigneg)))
X+ )
X+ 
X+ ;;; True if A is (numerically) a non-negative integer.  [P N] [Public]
X+ (defun math-natnump (a)
X+   (or (natnump a)
X+       (eq (car-safe a) 'bigpos))
X+ )
X+ 
X+ ;;; True if A is a rational (or integer).  [P x] [Public]
X+ (defun math-ratp (a)
X+   (or (integerp a)
X+       (memq (car-safe a) '(bigpos bigneg frac)))
X+ )
X+ 
X+ ;;; True if A is a real (or rational).  [P x] [Public]
X+ (defun math-realp (a)
X+   (or (integerp a)
X+       (memq (car-safe a) '(bigpos bigneg frac float)))
X+ )
X+ 
X+ ;;; True if A is a real or HMS form.  [P x] [Public]
X+ (defun math-anglep (a)
X+   (or (integerp a)
X+       (memq (car-safe a) '(bigpos bigneg frac float hms)))
X+ )
X+ 
X+ ;;; True if A is a number of any kind.  [P x] [Public]
X+ (defun math-numberp (a)
X+   (or (integerp a)
X+       (memq (car-safe a) '(bigpos bigneg frac float cplx polar)))
X+ )
X+ 
X+ ;;; True if A is a complex number or angle.  [P x] [Public]
X+ (defun math-scalarp (a)
X+   (or (integerp a)
X+       (memq (car-safe a) '(bigpos bigneg frac float cplx polar hms)))
X+ )
X+ 
X+ ;;; True if A is a vector.  [P x] [Public]
X+ (defun math-vectorp (a)
X+   (eq (car-safe a) 'vec)
X+ )
X+ 
X+ ;;; True if A is any vector or scalar data object.  [P x]
X+ (defun math-objvecp (a)    ;  [Public]
X+   (or (integerp a)
X+       (memq (car-safe a) '(bigpos bigneg frac float cplx polar
X+ 				  hms sdev intv mod vec incomplete)))
X+ )
X+ 
X+ ;;; True if A is numerically (but not literally) an integer.  [P x] [Public]
X+ (defun math-messy-integerp (a)
X+   (cond
X+    ((eq (car-safe a) 'float) (>= (nth 2 a) 0))
X+    ((eq (car-safe a) 'frac) (Math-integerp (math-normalize a))))
X+ )
X+ 
X  ;;; True if A is numerically an integer.  [P x] [Public]
X  (defun math-num-integerp (a)
X    (or (Math-integerp a)
X***************
X*** 5959,5964 ****
X--- 9891,9908 ----
X  	 (= (car dims) (nth 1 dims))))
X  )
X  
X+ ;;; True if A is any scalar data object.  [P x]
X+ (defun math-objectp (a)    ;  [Public]
X+   (or (integerp a)
X+       (memq (car-safe a) '(bigpos bigneg frac float cplx
X+ 				  polar hms sdev intv mod)))
X+ )
X+ (defmacro Math-objectp (a)    ;  [Public]
X+   (` (or (not (consp (, a)))
X+ 	 (memq (car (, a))
X+ 	       '(bigpos bigneg frac float cplx polar hms sdev intv mod))))
X+ )
X+ 
X  ;;; True if A is any real scalar data object.  [P x]
X  (defun math-real-objectp (a)    ;  [Public]
X    (or (integerp a)
X***************
X*** 5965,5981 ****
X        (memq (car-safe a) '(bigpos bigneg frac float hms sdev intv mod)))
X  )
X  
X! ;;; True if A is an object not composed of sub-formulas .  [P x] [Public]
X! (defun math-primp (a)
X!   (or (integerp a)
X!       (memq (car-safe a) '(bigpos bigneg frac float cplx polar
X! 				  hms mod var)))
X! )
X! (defmacro Math-primp (a)
X!   (` (or (not (consp (, a)))
X! 	 (memq (car (, a)) '(bigpos bigneg frac float cplx polar
X! 				    hms mod var))))
X! )
X  
X  ;;; True if A is a constant or vector of constants.  [P x] [Public]
X  (defun math-constp (a)
X--- 9909,9915 ----
X        (memq (car-safe a) '(bigpos bigneg frac float hms sdev intv mod)))
X  )
X  
X! ;;; Math-primp moved up so calc-select stuff can use it.
X  
X  ;;; True if A is a constant or vector of constants.  [P x] [Public]
X  (defun math-constp (a)
X***************
X*** 6058,6063 ****
X--- 9992,10072 ----
X  )
X  
X  
X+ (defun math-normalize-fancy (a)
X+   (cond ((eq (car a) 'frac)
X+ 	 (math-make-frac (math-normalize (nth 1 a))
X+ 			 (math-normalize (nth 2 a))))
X+ 	((eq (car a) 'cplx)
X+ 	 (let ((real (math-normalize (nth 1 a)))
X+ 	       (imag (math-normalize (nth 2 a))))
X+ 	   (if (math-zerop imag) real (list 'cplx real imag))))
X+ 	((eq (car a) 'polar)
X+ 	 (math-normalize-polar a))
X+ 	((eq (car a) 'hms)
X+ 	 (math-normalize-hms a))
X+ 	((eq (car a) 'mod)
X+ 	 (math-normalize-mod a))
X+ 	((eq (car a) 'sdev)
X+ 	 (let ((x (math-normalize (nth 1 a)))
X+ 	       (s (math-normalize (nth 2 a))))
X+ 	   (if (or (and (Math-objectp x) (not (Math-anglep x)))
X+ 		   (and (Math-objectp s) (not (Math-anglep s))))
X+ 	       (list 'calcFunc-sdev x s)
X+ 	     (math-make-sdev x s))))
X+ 	((eq (car a) 'intv)
X+ 	 (let ((mask (math-normalize (nth 1 a)))
X+ 	       (lo (math-normalize (nth 2 a)))
X+ 	       (hi (math-normalize (nth 3 a))))
X+ 	   (if (or (and (Math-objectp lo) (not (Math-anglep lo)))
X+ 		   (and (Math-objectp hi) (not (Math-anglep hi))))
X+ 	       (list 'calcFunc-intv mask lo hi)
X+ 	     (math-make-intv mask lo hi))))
X+ 	((eq (car a) 'vec)
X+ 	 (cons 'vec (mapcar 'math-normalize (cdr a))))
X+ 	((eq (car a) 'quote)
X+ 	 (math-normalize (nth 1 a)))
X+ 	((eq (car a) 'special-const)
X+ 	 (calc-with-default-simplification
X+ 	  (math-normalize (nth 1 a))))
X+ 	((eq (car a) 'var)
X+ 	 (cons 'var (cdr a)))   ; need to re-cons for selection routines
X+ 	((eq (car a) 'calcFunc-if)
X+ 	 (math-normalize-logical-op a))
X+ 	((memq (car a) '(calcFunc-lambda calcFunc-quote))
X+ 	 (let ((calc-simplify-mode 'none))
X+ 	   (cons (car a) (mapcar 'math-normalize (cdr a)))))
X+ 	((or (integerp (car a)) (consp (car a)))
X+ 	 (if (null (cdr a))
X+ 	     (math-normalize (car a))
X+ 	   (error "Can't use multi-valued function in an expression"))))
X+ )
X+ 
X+ (defun math-normalize-nonstandard (a)
X+   (and (symbolp (car a))
X+        (or (eq calc-simplify-mode 'none)
X+ 	   (and (eq calc-simplify-mode 'num)
X+ 		(let ((aptr args))
X+ 		  (while (and aptr (or (math-scalarp (car aptr))
X+ 				       (eq (car-safe (car aptr))
X+ 					   'mod)))
X+ 		    (setq aptr (cdr aptr)))
X+ 		  aptr)))
X+        (cons (car a) args))
X+ )
X+ 
X+ 
X+ ;;; Normalize a bignum digit list by trimming high-end zeros.  [L l]
X+ (defun math-norm-bignum (a)
X+   (let ((digs a) (last nil))
X+     (while digs
X+       (or (eq (car digs) 0) (setq last digs))
X+       (setq digs (cdr digs)))
X+     (and last
X+ 	 (progn
X+ 	   (setcdr last nil)
X+ 	   a)))
X+ )
X+ 
X  (defun math-bignum-test (a)   ; [B N; B s; b b]
X    (if (consp a)
X        a
X***************
X*** 6105,6111 ****
X  	 (math-compare (math-mul a (nth 2 b)) (nth 1 b)))
X  	((and (eq (car-safe a) 'float) (eq (car-safe b) 'float))
X  	 (if (math-lessp-float a b) -1 1))
X! 	((and (Math-anglep a) (Math-anglep b))
X  	 (math-sign (math-add a (math-neg b))))
X  	((eq (car-safe a) 'var)
X  	 2)
X--- 10114,10123 ----
X  	 (math-compare (math-mul a (nth 2 b)) (nth 1 b)))
X  	((and (eq (car-safe a) 'float) (eq (car-safe b) 'float))
X  	 (if (math-lessp-float a b) -1 1))
X! 	((and (or (Math-anglep a)
X! 		  (and (eq (car a) 'cplx) (eq (nth 2 a) 0)))
X! 	      (or (Math-anglep b)
X! 		  (and (eq (car b) 'cplx) (eq (nth 2 b) 0))))
X  	 (math-sign (math-add a (math-neg b))))
X  	((eq (car-safe a) 'var)
X  	 2)
X***************
X*** 6146,6157 ****
X    (let ((ediff (- (nth 2 a) (nth 2 b))))
X      (if (>= ediff 0)
X  	(if (>= ediff (+ calc-internal-prec calc-internal-prec))
X! 	    (Math-integer-negp (nth 1 a))
X  	  (Math-lessp (math-scale-int (nth 1 a) ediff)
X  		      (nth 1 b)))
X        (if (>= (setq ediff (- ediff))
X  	      (+ calc-internal-prec calc-internal-prec))
X! 	  (Math-integer-posp (nth 1 b))
X  	(Math-lessp (nth 1 a)
X  		    (math-scale-int (nth 1 b) ediff)))))
X  )
X--- 10158,10173 ----
X    (let ((ediff (- (nth 2 a) (nth 2 b))))
X      (if (>= ediff 0)
X  	(if (>= ediff (+ calc-internal-prec calc-internal-prec))
X! 	    (if (eq (nth 1 a) 0)
X! 		(Math-integer-posp (nth 1 b))
X! 	      (Math-integer-negp (nth 1 a)))
X  	  (Math-lessp (math-scale-int (nth 1 a) ediff)
X  		      (nth 1 b)))
X        (if (>= (setq ediff (- ediff))
X  	      (+ calc-internal-prec calc-internal-prec))
X! 	  (if (eq (nth 1 b) 0)
X! 	      (Math-integer-negp (nth 1 a))
X! 	    (Math-integer-posp (nth 1 b)))
X  	(Math-lessp (nth 1 a)
X  		    (math-scale-int (nth 1 b) ediff)))))
X  )
X***************
X*** 6199,6207 ****
X  ;;; Convert a function name into a like-looking variable name formula.
X  (defun math-calcFunc-to-var (f)
X    (if (symbolp f)
X!       (let ((base (if (string-match "\\`calcFunc-\\(.+\\)\\'" (symbol-name f))
X! 		      (math-match-substring (symbol-name f) 1)
X! 		    (symbol-name f))))
X  	(list 'var
X  	      (intern base)
X  	      (intern (concat "var-" base))))
X--- 10215,10233 ----
X  ;;; Convert a function name into a like-looking variable name formula.
X  (defun math-calcFunc-to-var (f)
X    (if (symbolp f)
X!       (let* ((func (or (cdr (assq f '( ( + . calcFunc-add )
X! 				       ( - . calcFunc-sub )
X! 				       ( * . calcFunc-mul )
X! 				       ( / . calcFunc-div )
X! 				       ( ^ . calcFunc-pow )
X! 				       ( % . calcFunc-mod )
X! 				       ( neg . calcFunc-neg )
X! 				       ( | . calcFunc-vconcat ) )))
X! 		       f))
X! 	     (base (if (string-match "\\`calcFunc-\\(.+\\)\\'"
X! 				     (symbol-name func))
X! 		       (math-match-substring (symbol-name func) 1)
X! 		     (symbol-name func))))
X  	(list 'var
X  	      (intern base)
X  	      (intern (concat "var-" base))))
X***************
X*** 6221,6227 ****
X  		    argvals (cdr argvals)))
X  	    res)
X  	(cons 'calcFunc-call (cons (math-calcFunc-to-var f) args)))
X!     (cons f args))
X  )
X  
X  (defun calcFunc-call (f &rest args)
X--- 10247,10265 ----
X  		    argvals (cdr argvals)))
X  	    res)
X  	(cons 'calcFunc-call (cons (math-calcFunc-to-var f) args)))
X!     (if (and (eq f 'calcFunc-neg)
X! 	     (= (length args) 1))
X! 	(list 'neg (car args))
X!       (let ((func (assq f '( ( calcFunc-add . + )
X! 			     ( calcFunc-sub . - )
X! 			     ( calcFunc-mul . * )
X! 			     ( calcFunc-div . / )
X! 			     ( calcFunc-pow . ^ )
X! 			     ( calcFunc-mod . % )
X! 			     ( calcFunc-vconcat . | ) ))))
X! 	(if (and func (= (length args) 2))
X! 	    (cons (cdr func) args)
X! 	  (cons f args)))))
X  )
X  
X  (defun calcFunc-call (f &rest args)
X***************
X*** 6239,6244 ****
X--- 10277,10341 ----
X  
X  
X  
X+ ;;;; [calc-frac.el]
X+ 
X+ ;;;; Fractions.
X+ 
X+ ;;; Build a normalized fraction.  [R I I]
X+ ;;; (This could probably be implemented more efficiently than using
X+ ;;;  the plain gcd algorithm.)
X+ (defun math-make-frac (num den)
X+   (if (Math-integer-negp den)
X+       (setq num (math-neg num)
X+ 	    den (math-neg den)))
X+   (let ((gcd (math-gcd num den)))
X+     (if (eq gcd 1)
X+ 	(if (eq den 1)
X+ 	    num
X+ 	  (list 'frac num den))
X+       (if (equal gcd den)
X+ 	  (math-quotient num gcd)
X+ 	(list 'frac (math-quotient num gcd) (math-quotient den gcd)))))
X+ )
X+ 
X+ (defun calc-add-fractions (a b)
X+   (if (eq (car-safe a) 'frac)
X+       (if (eq (car-safe b) 'frac)
X+ 	  (math-make-frac (math-add (math-mul (nth 1 a) (nth 2 b))
X+ 				    (math-mul (nth 2 a) (nth 1 b)))
X+ 			  (math-mul (nth 2 a) (nth 2 b)))
X+ 	(math-make-frac (math-add (nth 1 a)
X+ 				  (math-mul (nth 2 a) b))
X+ 			(nth 2 a)))
X+     (math-make-frac (math-add (math-mul a (nth 2 b))
X+ 			      (nth 1 b))
X+ 		    (nth 2 b)))
X+ )
X+ 
X+ (defun calc-mul-fractions (a b)
X+   (if (eq (car-safe a) 'frac)
X+       (if (eq (car-safe b) 'frac)
X+ 	  (math-make-frac (math-mul (nth 1 a) (nth 1 b))
X+ 			  (math-mul (nth 2 a) (nth 2 b)))
X+ 	(math-make-frac (math-mul (nth 1 a) b)
X+ 			(nth 2 a)))
X+     (math-make-frac (math-mul a (nth 1 b))
X+ 		    (nth 2 b)))
X+ )
X+ 
X+ (defun calc-div-fractions (a b)
X+   (if (eq (car-safe a) 'frac)
X+       (if (eq (car-safe b) 'frac)
X+ 	  (math-make-frac (math-mul (nth 1 a) (nth 2 b))
X+ 			  (math-mul (nth 2 a) (nth 1 b)))
X+ 	(math-make-frac (nth 1 a)
X+ 			(math-mul (nth 2 a) b)))
X+     (math-make-frac (math-mul a (nth 2 b))
X+ 		    (nth 1 b)))
X+ )
X+ 
X+ 
X+ 
X  ;;;; [calc-vec.el]
X  
X  ;;;; Vectors.
X***************
X*** 6293,6298 ****
X--- 10390,10421 ----
X      obj)
X  )
X  
X+ (defun math-vector-head (vec)
X+   (if (and (Math-vectorp vec)
X+ 	   (cdr (cdr vec)))
X+       (nth 1 vec)
X+     (math-record-why 'vectorp vec)
X+     (list 'calcFunc-head vec))
X+ )
X+ (fset 'calcFunc-head (symbol-function 'math-vector-head))
X+ 
X+ (defun math-vector-tail (vec)
X+   (if (and (Math-vectorp vec)
X+ 	   (cdr (cdr vec)))
X+       (cdr (cdr vec))
X+     (math-record-why 'vectorp vec)
X+     (list 'calcFunc-tail vec))
X+ )
X+ (fset 'calcFunc-tail (symbol-function 'math-vector-tail))
X+ 
X+ (defun math-cons-vec (head tail)
X+   (if (Math-vectorp tail)
X+       (cons 'vec (cons head (cdr tail)))
X+     (math-record-why 'vectorp tail)
X+     (list 'calcFunc-cons head tail))
X+ )
X+ (fset 'calcFunc-cons (symbol-function 'math-cons-vec))
X+ 
X  
X  ;;;; [calc-mat.el]
X  
X***************
X*** 6400,6421 ****
X  	 (vec nil)
X  	 (i -1)
X  	 len cols obj expr)
X!     (if (eq mode 'rows)
X! 	()
X!       (while (and (< (setq i (1+ i)) nargs)
X! 		  (not (math-matrixp (aref ptrs i)))))
X!       (if (< i nargs)
X! 	  (if (eq mode 'elems)
X! 	      (setq func (list 'lambda '(&rest x)
X! 			       (list 'math-symb-map
X! 				     (list 'quote f) '(quote elems) 'x))
X! 		    mode 'rows)
X! 	    (while (< i nargs)
X! 	      (if (math-matrixp (aref ptrs i))
X! 		  (aset ptrs i (math-transpose (aref ptrs i))))
X! 	      (setq i (1+ i))))
X! 	(setq mode 'elems))
X!       (setq i -1))
X      (while (< (setq i (1+ i)) nargs)
X        (setq obj (aref ptrs i))
X        (if (and (eq (car-safe obj) 'vec)
X--- 10523,10543 ----
X  	 (vec nil)
X  	 (i -1)
X  	 len cols obj expr)
X!     (while (and (< (setq i (1+ i)) nargs)
X! 		(not (math-matrixp (aref ptrs i)))))
X!     (if (< i nargs)
X! 	(if (eq mode 'elems)
X! 	    (setq func (list 'lambda '(&rest x)
X! 			     (list 'math-symb-map
X! 				   (list 'quote f) '(quote elems) 'x))
X! 		  mode 'rows)
X! 	  (if (eq mode 'cols)
X! 	      (while (< i nargs)
X! 		(if (math-matrixp (aref ptrs i))
X! 		    (aset ptrs i (math-transpose (aref ptrs i))))
X! 		(setq i (1+ i)))))
X!       (setq mode 'elems))
X!     (setq i -1)
X      (while (< (setq i (1+ i)) nargs)
X        (setq obj (aref ptrs i))
X        (if (and (eq (car-safe obj) 'vec)
X***************
X*** 6566,6571 ****
X--- 10688,10764 ----
X      (calcFunc-reducer func vec))
X  )
X  
X+ (defun calcFunc-accum (func vec)
X+   (setq func (math-var-to-calcFunc func))
X+   (or (math-vectorp vec)
X+       (math-reject-arg vec 'vectorp))
X+   (let* ((expr (car (setq vec (cdr vec))))
X+ 	 (res (list 'vec expr)))
X+     (or expr
X+ 	(math-reject-arg vec "Vector is empty"))
X+     (while (setq vec (cdr vec))
X+       (setq expr (math-build-call func (list expr (car vec)))
X+ 	    res (nconc res (list expr))))
X+     (math-normalize res))
X+ )
X+ 
X+ 
X+ (defun calcFunc-outer (func a b)
X+   (or (math-vectorp a) (math-reject-arg a 'vectorp))
X+   (or (math-vectorp b) (math-reject-arg b 'vectorp))
X+   (setq func (math-var-to-calcFunc func))
X+   (let ((mat nil))
X+     (while (setq a (cdr a))
X+       (setq mat (cons (cons 'vec
X+ 			    (mapcar (function (lambda (x)
X+ 						(math-build-call func
X+ 								 (list (car a)
X+ 								       x))))
X+ 				    (cdr b)))
X+ 		      mat)))
X+     (math-normalize (cons 'vec (nreverse mat))))
X+ )
X+ 
X+ 
X+ (defun calcFunc-inner (mul-func add-func a b)
X+   (or (math-vectorp a) (math-reject-arg a 'vectorp))
X+   (or (math-vectorp b) (math-reject-arg b 'vectorp))
X+   (if (math-matrixp a)
X+       (if (math-matrixp b)
X+ 	  (cons 'vec (math-inner-mats (cdr a) (mapcar 'cdr (cdr b))))
X+ 	(math-mat-col
X+ 	 (cons 'vec
X+ 	       (if (= (length (nth 1 a)) 2)
X+ 		   (math-inner-mats (cdr a)
X+ 				  (mapcar 'cdr (cdr (math-row-matrix b))))
X+ 		 (math-inner-mats (cdr a)
X+ 				  (mapcar 'cdr (cdr (math-col-matrix b))))))
X+ 	 1))
X+     (if (math-matrixp b)
X+ 	(cons 'vec (math-inner-mat-row a (mapcar 'cdr (cdr b))))
X+       (car (math-inner-mat-row a
X+ 			     (mapcar 'cdr (cdr (math-col-matrix b)))))))
X+ )
X+ 
X+ (defun math-inner-mats (a b)
X+   (and a
X+        (cons (cons 'vec (math-inner-mat-row (car a) b))
X+ 	     (math-inner-mats (cdr a) b)))
X+ )
X+ 
X+ (defun math-inner-mat-row (a b)    ; uses "mul-func", "add-func"
X+   (if (math-no-empty-rows b)
X+       (cons
X+        (calcFunc-reduce add-func
X+ 			(calcFunc-map mul-func
X+ 				      a
X+ 				      (cons 'vec (mapcar 'car b))))
X+        (math-inner-mat-row a (mapcar 'cdr b)))
X+     (if (math-list-all-nil b)
X+ 	nil
X+       (math-dimension-error)))
X+ )
X+ 
X  
X  ;;;; [calc-mat.el]
X  
X***************
X*** 6618,6627 ****
X  )
X  
X  (defun calcFunc-mrow (mat n)   ; [Public]
X!   (and (integerp (setq n (math-check-integer n)))
X!        (> n 0)
X!        (math-vectorp mat)
X!        (nth n mat))
X  )
X  
X  ;;; Get the Nth column of a matrix.
X--- 10811,10826 ----
X  )
X  
X  (defun calcFunc-mrow (mat n)   ; [Public]
X!   (if (Math-vectorp n)
X!       (math-map-vec (function (lambda (x) (calcFunc-mrow mat x))) n)
X!     (if (eq (car-safe n) 'intv)
X! 	(math-subvector mat
X! 			(math-add (nth 2 n) (if (memq (nth 1 n) '(2 3)) 0 1))
X! 			(math-add (nth 3 n) (if (memq (nth 1 n) '(1 3)) 1 0)))
X!       (and (integerp (setq n (math-check-integer n)))
X! 	   (> n 0)
X! 	   (Math-vectorp mat)
X! 	   (nth n mat))))
X  )
X  
X  ;;; Get the Nth column of a matrix.
X***************
X*** 6630,6642 ****
X  )
X  
X  (defun calcFunc-mcol (mat n)   ; [Public]
X!   (and (integerp (setq n (math-check-integer n)))
X!        (> n 0)
X!        (math-vectorp mat)
X!        (if (math-matrixp mat)
X! 	   (and (< n (length (nth 1 mat)))
X! 		(math-mat-col mat n))
X! 	 (nth n mat)))
X  )
X  
X  ;;; Remove the Nth row from a matrix.
X--- 10829,10847 ----
X  )
X  
X  (defun calcFunc-mcol (mat n)   ; [Public]
X!   (if (Math-vectorp n)
X!       (math-map-vec (function (lambda (x) (calcFunc-mcol mat x))) n)
X!     (if (eq (car-safe n) 'intv)
X! 	(if (math-matrixp mat)
X! 	    (math-map-vec (function (lambda (x) (calcFunc-mrow x n))) mat)
X! 	  (calcFunc-mrow mat n))
X!       (and (integerp (setq n (math-check-integer n)))
X! 	   (> n 0)
X! 	   (Math-vectorp mat)
X! 	   (if (math-matrixp mat)
X! 	       (and (< n (length (nth 1 mat)))
X! 		    (math-mat-col mat n))
X! 	     (nth n mat)))))
X  )
X  
X  ;;; Remove the Nth row from a matrix.
X***************
X*** 6767,6784 ****
X  )
X  
X  ;;; Create a vector of consecutive integers. [Public]
X! (defun math-vec-index (n)
X!   (and (not (integerp n))
X!        (setq n (math-check-fixnum n)))
X!   (or (natnump n) (math-reject-arg n 'natnump))
X!   (let ((vec nil))
X!     (while (> n 0)
X!       (setq vec (cons n vec)
X! 	    n (1- n)))
X!     (cons 'vec vec))
X  )
X  (fset 'calcFunc-index (symbol-function 'math-vec-index))
X  
X  
X  ;;; Compute the row and column norms of a vector or matrix.  [Public]
X  (defun math-rnorm (a)
X--- 10972,11081 ----
X  )
X  
X  ;;; Create a vector of consecutive integers. [Public]
X! (defun math-vec-index (n &optional start incr)
X!   (if (math-messy-integerp n)
X!       (math-float (math-vec-index (math-trunc n)))
X!     (and (not (integerp n))
X! 	 (setq n (math-check-fixnum n)))
X!     (let ((vec nil))
X!       (if start
X! 	  (progn
X! 	    (if (>= n 0)
X! 		(while (>= (setq n (1- n)) 0)
X! 		  (setq vec (cons start vec)
X! 			start (math-add start (or incr 1))))
SHAR_EOF
echo "End of part 7, continue with part 8"
echo "8" > s2_seq_.tmp
exit 0