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