v15i031: Patch for GNU Emacs Calc, version 1.04 -> 1.05, part 04/20
David Gillespie
daveg at csvax.cs.caltech.edu
Mon Oct 15 11:15:51 AEST 1990
Posting-number: Volume 15, Issue 31
Submitted-by: daveg at csvax.cs.caltech.edu (David Gillespie)
Archive-name: calc-1.05/part04
#!/bin/sh
# this is part 4 of a multipart archive
# do not concatenate these parts, unpack them in order with /bin/sh
# file calc.patch continued
#
CurArch=4
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*** 265,293 ****
X (define-key calc-mode-map "vb" 'calc-build-vector)
X (define-key calc-mode-map "vc" 'calc-mcol)
X (define-key calc-mode-map "vd" 'calc-diag)
X! (define-key calc-mode-map "vh" 'calc-histogram)
X (define-key calc-mode-map "vi" 'calc-ident)
X (define-key calc-mode-map "vl" 'calc-vlength)
X (define-key calc-mode-map "vn" 'calc-rnorm)
X (define-key calc-mode-map "vp" 'calc-pack)
X (define-key calc-mode-map "vr" 'calc-mrow)
X! (define-key calc-mode-map "vs" 'calc-sort)
X (define-key calc-mode-map "vt" 'calc-transpose)
X (define-key calc-mode-map "vu" 'calc-unpack)
X (define-key calc-mode-map "vx" 'calc-index)
X (define-key calc-mode-map "vA" 'calc-apply)
X (define-key calc-mode-map "vC" 'calc-cross)
X (define-key calc-mode-map "vD" 'calc-mdet)
X! (define-key calc-mode-map "vI" 'calc-inv)
X (define-key calc-mode-map "vJ" 'calc-conj-transpose)
X (define-key calc-mode-map "vL" 'calc-mlud)
X (define-key calc-mode-map "vM" 'calc-map)
X (define-key calc-mode-map "vN" 'calc-cnorm)
X (define-key calc-mode-map "vR" 'calc-reduce)
X (define-key calc-mode-map "vT" 'calc-mtrace)
X (define-key calc-mode-map "v<" 'calc-matrix-left-justify)
X (define-key calc-mode-map "v=" 'calc-matrix-center-justify)
X (define-key calc-mode-map "v>" 'calc-matrix-right-justify)
X (define-key calc-mode-map "v," 'calc-vector-commas)
X (define-key calc-mode-map "v[" 'calc-vector-brackets)
X (define-key calc-mode-map "v{" 'calc-vector-braces)
X--- 387,425 ----
X (define-key calc-mode-map "vb" 'calc-build-vector)
X (define-key calc-mode-map "vc" 'calc-mcol)
X (define-key calc-mode-map "vd" 'calc-diag)
X! (define-key calc-mode-map "ve" 'calc-expand-vector)
X! (define-key calc-mode-map "vf" 'calc-vector-find)
X (define-key calc-mode-map "vi" 'calc-ident)
X (define-key calc-mode-map "vl" 'calc-vlength)
X+ (define-key calc-mode-map "vm" 'calc-mask-vector)
X (define-key calc-mode-map "vn" 'calc-rnorm)
X (define-key calc-mode-map "vp" 'calc-pack)
X (define-key calc-mode-map "vr" 'calc-mrow)
X! (define-key calc-mode-map "vs" 'calc-subvector)
X (define-key calc-mode-map "vt" 'calc-transpose)
X (define-key calc-mode-map "vu" 'calc-unpack)
X+ (define-key calc-mode-map "vv" 'calc-reverse-vector)
X (define-key calc-mode-map "vx" 'calc-index)
X (define-key calc-mode-map "vA" 'calc-apply)
X (define-key calc-mode-map "vC" 'calc-cross)
X (define-key calc-mode-map "vD" 'calc-mdet)
X! (define-key calc-mode-map "vG" 'calc-grade)
X! (define-key calc-mode-map "vH" 'calc-histogram)
X! (define-key calc-mode-map "vI" 'calc-inner-product)
X (define-key calc-mode-map "vJ" 'calc-conj-transpose)
X (define-key calc-mode-map "vL" 'calc-mlud)
X (define-key calc-mode-map "vM" 'calc-map)
X (define-key calc-mode-map "vN" 'calc-cnorm)
X+ (define-key calc-mode-map "vO" 'calc-outer-product)
X (define-key calc-mode-map "vR" 'calc-reduce)
X+ (define-key calc-mode-map "vS" 'calc-sort)
X (define-key calc-mode-map "vT" 'calc-mtrace)
X+ (define-key calc-mode-map "v&" 'calc-inv)
X (define-key calc-mode-map "v<" 'calc-matrix-left-justify)
X (define-key calc-mode-map "v=" 'calc-matrix-center-justify)
X (define-key calc-mode-map "v>" 'calc-matrix-right-justify)
X+ (define-key calc-mode-map "v." 'calc-full-vectors)
X+ (define-key calc-mode-map "v/" 'calc-break-vectors)
X (define-key calc-mode-map "v," 'calc-vector-commas)
X (define-key calc-mode-map "v[" 'calc-vector-brackets)
X (define-key calc-mode-map "v{" 'calc-vector-braces)
X***************
X*** 324,333 ****
X--- 456,494 ----
X (define-key calc-mode-map "Z=" 'calc-kbd-report)
X (define-key calc-mode-map "Z#" 'calc-kbd-query)
X
X+ (calc-init-prefixes)
X+
X+ (mapcar (function
X+ (lambda (x)
X+ (define-key calc-mode-map (format "c%c" x) 'calc-clean-num)
X+ (define-key calc-mode-map (format "g%c" x) 'calc-select-part)))
X+ "123456789")
X+
X ;;;; (Autoloads here)
X
X )
X
X+ (defun calc-init-prefixes ()
X+ (if calc-shift-prefix
X+ (progn
X+ (aset calc-mode-map ?A (aref calc-mode-map ?a))
X+ (aset calc-mode-map ?B (aref calc-mode-map ?b))
X+ (aset calc-mode-map ?D (aref calc-mode-map ?d))
X+ (aset calc-mode-map ?F (aref calc-mode-map ?f))
X+ (aset calc-mode-map ?G (aref calc-mode-map ?g))
X+ (aset calc-mode-map ?J (aref calc-mode-map ?j))
X+ (aset calc-mode-map ?K (aref calc-mode-map ?k))
X+ (aset calc-mode-map ?M (aref calc-mode-map ?m)))
X+ (define-key calc-mode-map "A" 'calc-abs)
X+ (define-key calc-mode-map "B" 'calc-log)
X+ (define-key calc-mode-map "D" 'calc-redo)
X+ (define-key calc-mode-map "F" 'calc-floor)
X+ (define-key calc-mode-map "G" 'calc-argument)
X+ (define-key calc-mode-map "J" 'calc-conj)
X+ (define-key calc-mode-map "K" 'calc-call-last-kbd-macro)
X+ (define-key calc-mode-map "M" 'calc-more-recursion-depth))
X+ )
X+
X (calc-init-extensions)
X
X
X***************
X*** 335,340 ****
X--- 496,506 ----
X
X ;;;; Miscellaneous.
X
X+ (defun calc-clear-command-flag (f)
X+ (setq calc-command-flags (delq f calc-command-flags))
X+ )
X+
X+
X (defun calc-record-message (tag &rest args)
X (let ((msg (apply 'format args)))
X (message "%s" msg)
X***************
X*** 343,378 ****
X )
X
X
X (defun calc-do-prefix-help (msgs group key)
X! (if (cdr msgs)
X! (progn
X! (setq calc-prefix-help-phase
X! (if (eq this-command last-command)
X! (% (1+ calc-prefix-help-phase) (1+ (length msgs)))
X! 0))
X! (let ((msg (nth calc-prefix-help-phase msgs)))
X! (message "%s" (if msg
X! (concat group ": " msg ":"
X! (make-string
X! (- (apply 'max (mapcar 'length msgs))
X! (length msg)) 32)
X! " [MORE]"
X! (if key
X! (concat " " (char-to-string key) "-")
X! ""))
X! (format "%c-" key)))))
X! (setq calc-prefix-help-phase 0)
X! (if key
X! (if msgs
X! (message (concat group ": " (car msgs) ": "
X! (char-to-string key) "-"))
X! (message (concat group ": (none) " (char-to-string key) "-")))
X! (message (concat group ": " (car msgs)))))
X! (and key
X! (setq unread-command-char key))
X )
X (defvar calc-prefix-help-phase 0)
X
X
X
X
X--- 509,645 ----
X )
X
X
X+ (defun calc-normalize-fancy (val)
X+ (cond ((eq calc-simplify-mode 'binary)
X+ (let ((s (math-normalize val)))
X+ (if (math-realp s)
X+ (math-clip (math-round s))
X+ s)))
X+ ((eq calc-simplify-mode 'alg)
X+ (math-simplify val))
X+ ((eq calc-simplify-mode 'ext)
X+ (math-simplify-extended val))
X+ ((eq calc-simplify-mode 'units)
X+ (math-simplify-units val)))
X+ )
X+
X+
X (defun calc-do-prefix-help (msgs group key)
X! (if calc-full-help-flag
X! (list msgs group key)
X! (if (cdr msgs)
X! (progn
X! (setq calc-prefix-help-phase
X! (if (eq this-command last-command)
X! (% (1+ calc-prefix-help-phase) (1+ (length msgs)))
X! 0))
X! (let ((msg (nth calc-prefix-help-phase msgs)))
X! (message "%s" (if msg
X! (concat group ": " msg ":"
X! (make-string
X! (- (apply 'max (mapcar 'length msgs))
X! (length msg)) 32)
X! " [MORE]"
X! (if key
X! (concat " " (char-to-string key)
X! "-")
X! ""))
X! (if key (format "%c-" key) "")))))
X! (setq calc-prefix-help-phase 0)
X! (if key
X! (if msgs
X! (message (concat group ": " (car msgs) ": "
X! (char-to-string key) "-"))
X! (message (concat group ": (none) " (char-to-string key) "-")))
X! (message (concat group ": " (car msgs)))))
X! (and key
X! (setq unread-command-char key)))
X )
X (defvar calc-prefix-help-phase 0)
X
X+ ;;;; [calc-stuff.el]
X+
X+ (defun calc-full-help ()
X+ "Display all the `?' responses at once in the *Help* buffer."
X+ (interactive)
X+ (with-output-to-temp-buffer "*Help*"
X+ (let ((comma (1+ (string-match ", " calc-version))))
X+ (princ (format "%s\n %s.\n\n" (substring calc-version 0 comma)
X+ (substring calc-version comma))))
X+ (princ (substitute-command-keys "Type `\\[describe-mode]' for more detail.\n"))
X+ (princ "Or press `i' to read the full Calc manual on-line.\n\n")
X+ (princ "Basic keys:\n")
X+ (let* ((calc-full-help-flag t))
X+ (mapcar (function (lambda (x) (princ (format " %s\n" x)))) (calc-help))
X+ (mapcar (function (lambda (prefix)
X+ (let ((msgs (funcall prefix)))
X+ (princ (if (eq (nth 2 msgs) ?v)
X+ "\n`v' or `V' prefix (vector/matrix) keys: \n"
X+ (if (nth 2 msgs)
X+ (format "\n`%c' prefix (%s) keys:\n"
X+ (nth 2 msgs) (nth 1 msgs))
X+ (format "\n%s-modified keys:\n"
X+ (capitalize (nth 1 msgs))))))
X+ (mapcar (function (lambda (x)
X+ (princ (format " %s\n" x))))
X+ (car msgs)))))
X+ '(calc-inverse-prefix-help
X+ calc-hyperbolic-prefix-help
X+ calc-inv-hyp-prefix-help
X+ calc-a-prefix-help
X+ calc-b-prefix-help
X+ calc-c-prefix-help
X+ calc-d-prefix-help
X+ calc-f-prefix-help
X+ calc-g-prefix-help
X+ calc-j-prefix-help
X+ calc-k-prefix-help
X+ calc-m-prefix-help
X+ calc-t-prefix-help
X+ calc-u-prefix-help
X+ calc-v-prefix-help
X+ calc-shift-Z-prefix-help
X+ calc-z-prefix-help)))
X+ (print-help-return-message))
X+ )
X+
X+ (defun calc-inverse-prefix-help ()
X+ (interactive)
X+ (calc-do-prefix-help
X+ '("I + S (arcsin), C (arccos), T (arctan); Q (square)"
X+ "I + E (ln), L (exp), B (alog: B^X); f E (lnp1), f L (expm1)"
X+ "I + F (ceiling), R (truncate); a S (invert func)"
X+ "I + a m (match-not); c h (from-hms); k n (prev prime)"
X+ "I + f G (gamma-Q); f e (erfc); k B (etc., lower-tail dists)"
X+ "I + V S (reverse sort); V G (reverse grade)")
X+ "inverse" nil)
X+ )
X+
X+ (defun calc-hyperbolic-prefix-help ()
X+ (interactive)
X+ (calc-do-prefix-help
X+ '("H + S (sinh), C (cosh), T (tanh); E (exp10), L (log10)"
X+ "H + F (float floor), R (float round); P (constant \"e\")"
X+ "H + a d (total derivative); k c (permutations)"
X+ "H + k b (bern-poly), k e (euler-poly); k s (stirling-2)"
X+ "H + f G (gamma-g), f B (beta-B); V R (accumulate)"
X+ "H + v e (expand w/filler); V H (weighted histogram)"
X+ "H + a S (general solve eqn), j I (general isolate)"
X+ "H + a R (widen/root)")
X+ "hyperbolic" nil)
X+ )
X+
X+ (defun calc-inv-hyp-prefix-help ()
X+ (interactive)
X+ (calc-do-prefix-help
X+ '("I H + S (arcsinh), C (arccosh), T (arctanh)"
X+ "I H + E (log10), L (exp10); f G (gamma-G)"
X+ "I H + F (float ceiling), R (float truncate)"
X+ "I H + a S (general invert func)")
X+ "inverse-hyperbolic" nil)
X+ )
X+
X+ ;;;; [calc-ext.el]
X
X
X
X***************
X*** 381,391 ****
X--- 648,684 ----
X
X ;;; General.
X
X+ (defun calc-scroll-left (n)
X+ "Horizontally scroll one half-screen to the left."
X+ (interactive "P")
X+ (scroll-left (or n (/ (window-width) 2)))
X+ )
X+
X+ (defun calc-scroll-right (n)
X+ "Horizontally scroll one half-screen to the right."
X+ (interactive "P")
X+ (scroll-right (or n (/ (window-width) 2)))
X+ )
X+
X+
X+ (defun calc-precision (n)
X+ "Set current float precision for Calculator to N digits."
X+ (interactive "NPrecision: ")
X+ (calc-wrapper
X+ (if (< (prefix-numeric-value n) 3)
X+ (error "Precision must be at least 3 digits.")
X+ (setq calc-internal-prec (prefix-numeric-value n))
X+ (calc-record calc-internal-prec "prec"))
X+ (message "Floating-point precision is %d digits." calc-internal-prec))
X+ )
X+
X+
X (defun calc-inverse (&optional n)
X "Next Calculator operation is inverse."
X (interactive "P")
X (calc-wrapper
X (calc-set-command-flag 'keep-flags)
X+ (calc-set-command-flag 'no-align)
X (setq calc-inverse-flag (not calc-inverse-flag)
X prefix-arg n)
X (message (if calc-inverse-flag "Inverse..." "")))
X***************
X*** 406,411 ****
X--- 699,705 ----
X (interactive "P")
X (calc-wrapper
X (calc-set-command-flag 'keep-flags)
X+ (calc-set-command-flag 'no-align)
X (setq calc-hyperbolic-flag (not calc-hyperbolic-flag)
X prefix-arg n)
X (message (if calc-hyperbolic-flag "Hyperbolic..." "")))
X***************
X*** 422,427 ****
X--- 716,742 ----
X )
X
X
X+ (defmacro calc-with-default-simplification (body)
X+ (list 'let
X+ '((calc-simplify-mode (and (not (memq calc-simplify-mode '(none num)))
X+ calc-simplify-mode)))
X+ body)
X+ )
X+
X+
X+ (defun calc-push (&rest vals)
X+ (calc-push-list vals)
X+ )
X+
X+ (defun calc-pop-push (n &rest vals)
X+ (calc-pop-push-list n vals)
X+ )
X+
X+ (defun calc-pop-push-record (n prefix &rest vals)
X+ (calc-pop-push-record-list n prefix vals)
X+ )
X+
X+
X (defun calc-evaluate (n)
X "Evaluate all variables in the expression on the top of the stack.
X With a numeric prefix argument, evaluate each of the top N stack elements."
X***************
X*** 465,470 ****
X--- 780,801 ----
X )
X
X
X+ (defun calc-realign (&optional num)
X+ "Realign Calc window with cursor and top-of-stack at the bottom."
X+ (interactive "P")
X+ (if num
X+ (progn
X+ (calc-check-stack num)
X+ (calc-cursor-stack-index num)
X+ (and calc-line-numbering
X+ (not calc-display-just)
X+ (forward-char 4)))
X+ (calc-wrapper))
X+ )
X+
X+
X+ ;;;; [calc-stuff.el]
X+
X (defun calc-num-prefix (n)
X "Use the number at the top of stack as the numeric prefix for the next command.
X With a prefix, push that prefix as a number onto the stack."
X***************
X*** 477,483 ****
X (setq num (math-trunc num)))
X (or (integerp num)
X (error "Argument must be a small integer"))
X! (calc-pop 1)
X (setq prefix-arg num)
X (message "%d-" num)))) ; a (lame) simulation of the real thing...
X )
X--- 808,814 ----
X (setq num (math-trunc num)))
X (or (integerp num)
X (error "Argument must be a small integer"))
X! (calc-pop-stack 1)
X (setq prefix-arg num)
X (message "%d-" num)))) ; a (lame) simulation of the real thing...
X )
X***************
X*** 509,514 ****
X--- 840,918 ----
X )
X
X
X+ (defun calc-explain-why (why)
X+ (let* ((pred (car why))
X+ (msg (cond ((not pred) "Wrong type of argument")
X+ ((stringp pred) pred)
X+ ((eq pred 'integerp) "Integer expected")
X+ ((eq pred 'natnump) "Nonnegative integer expected")
X+ ((eq pred 'fixnump) "Small integer expected")
X+ ((eq pred 'posp) "Positive number expected")
X+ ((eq pred 'negp) "Negative number expected")
X+ ((eq pred 'nonzerop) "Nonzero number expected")
X+ ((eq pred 'realp) "Real number expected")
X+ ((eq pred 'anglep) "Real number expected")
X+ ((eq pred 'hmsp) "HMS form expected")
X+ ((eq pred 'numberp) "Number expected")
X+ ((eq pred 'scalarp) "Number expected")
X+ ((eq pred 'vectorp) "Vector or matrix expected")
X+ ((eq pred 'numvecp) "Number or vector expected")
X+ ((eq pred 'square-matrixp) "Square matrix expected")
X+ ((eq pred 'objectp) "Number expected")
X+ ((eq pred 'constp) "Constant expected")
X+ ((eq pred 'range) "Argument out of range")
X+ (t (format "%s expected" pred))))
X+ (punc ": ")
X+ (calc-can-abbrev-vectors t))
X+ (while (setq why (cdr why))
X+ (and (car why)
X+ (setq msg (concat msg punc (if (stringp (car why))
X+ (car why)
X+ (math-format-flat-expr (car why) 0)))
X+ punc ", ")))
X+ (message "%s" msg))
X+ )
X+
X+ (defun calc-why ()
X+ "Explain why the last result was unusual."
X+ (interactive)
X+ (if (not (eq this-command last-command))
X+ (setq calc-which-why calc-why))
X+ (if calc-which-why
X+ (progn
X+ (calc-explain-why (car calc-which-why))
X+ (setq calc-which-why (cdr calc-which-why)))
X+ (if calc-why
X+ (progn
X+ (message "(No further explanations available)")
X+ (setq calc-which-why calc-why))
X+ (message "No explanations available")))
X+ )
X+ (setq calc-which-why nil)
X+
X+
X+ (defun calc-flush-caches ()
X+ "Clear all caches used internally by the Calculator, such as the values of
X+ pi and e. These values will be recomputed next time they are requested."
X+ (interactive)
X+ (calc-wrapper
X+ (setq math-lud-cache nil
X+ math-log2-cache nil
X+ math-max-digits-cache nil
X+ math-checked-rewrites nil
X+ math-integral-cache nil
X+ math-units-table nil
X+ math-graph-var-cache nil
X+ math-graph-data-cache nil)
X+ (mapcar (function (lambda (x) (set x -100))) math-cache-list)
X+ (message "All internal calculator caches have been reset."))
X+ )
X+
X+ ;;;; [calc-ext.el]
X+
X+ (setq math-cache-list nil)
X+
X+
X
X ;;;; [calc-forms.el]
X
X***************
X*** 537,543 ****
X "Begin entering a complex number in the Calculator."
X (interactive)
X (calc-wrapper
X! (if calc-algebraic-mode
X (calc-alg-entry "(")
X (calc-push (list 'incomplete calc-complex-mode))))
X )
X--- 941,947 ----
X "Begin entering a complex number in the Calculator."
X (interactive)
X (calc-wrapper
X! (if (or calc-algebraic-mode calc-incomplete-algebraic-mode)
X (calc-alg-entry "(")
X (calc-push (list 'incomplete calc-complex-mode))))
X )
X***************
X*** 569,575 ****
X "Begin entering a vector in the Calculator."
X (interactive)
X (calc-wrapper
X! (if calc-algebraic-mode
X (calc-alg-entry "[")
X (calc-push '(incomplete vec))))
X )
X--- 973,979 ----
X "Begin entering a vector in the Calculator."
X (interactive)
X (calc-wrapper
X! (if (or calc-algebraic-mode calc-incomplete-algebraic-mode)
X (calc-alg-entry "[")
X (calc-push '(incomplete vec))))
X )
X***************
X*** 613,623 ****
X '(0)
X (nthcdr (1- (length new)) new)))))
X (or allow-polar
X! (if (eq (nth 1 inc) 'polar)
X! (setq inc (append '(incomplete cplx) (cdr (cdr inc))))
X! (if (eq (nth 1 inc) 'intv)
X! (setq inc (append '(incomplete cplx)
X! (cdr (cdr (cdr inc))))))))
X (if (and (memq (nth 1 new) '(cplx polar))
X (> (length new) 4))
X (error "Too many components in complex number"))
X--- 1017,1027 ----
X '(0)
X (nthcdr (1- (length new)) new)))))
X (or allow-polar
X! (if (eq (nth 1 new) 'polar)
X! (setq new (append '(incomplete cplx) (cdr (cdr new))))
X! (if (eq (nth 1 new) 'intv)
X! (setq new (append '(incomplete cplx)
X! (cdr (cdr (cdr new))))))))
X (if (and (memq (nth 1 new) '(cplx polar))
X (> (length new) 4))
X (error "Too many components in complex number"))
X***************
X*** 658,664 ****
X calc-stack))) 'incomplete)
X (calc-end-vector)
X (calc-comma)
X! (let ((calc-algebraic-mode nil))
X (calc-begin-vector)))
X ((or (= (length inc) 2)
X (math-vectorp (nth 2 inc)))
X--- 1062,1069 ----
X calc-stack))) 'incomplete)
X (calc-end-vector)
X (calc-comma)
X! (let ((calc-algebraic-mode nil)
X! (calc-incomplete-algebraic-mode nil))
X (calc-begin-vector)))
X ((or (= (length inc) 2)
X (math-vectorp (nth 2 inc)))
X***************
X*** 672,677 ****
X--- 1077,1098 ----
X (list 'incomplete 'vec)))))))
X )
X
X+ (defun calc-digit-dots ()
X+ (if (eq calc-prev-char ?.)
X+ (progn
X+ (delete-backward-char 1)
X+ (if (calc-minibuffer-contains ".*\\.\\'")
X+ (delete-backward-char 1))
X+ (setq calc-prev-char 'dots
X+ last-command-char 32)
X+ (if calc-prev-prev-char
X+ (calcDigit-nondigit)
X+ (setq calc-digit-value nil)
X+ (exit-minibuffer)))
X+ ;; just ignore extra decimal point, anticipating ".."
X+ (delete-backward-char 1))
X+ )
X+
X (defun calc-dots ()
X "Separate parts of an interval form during entry with a \"..\" symbol."
X (interactive)
X***************
X*** 708,713 ****
X--- 1129,1143 ----
X (calc-find-first-incomplete (cdr stack) (1+ n))))
X )
X
X+ (defun calc-incomplete-error (a)
X+ (cond ((memq (nth 1 a) '(cplx polar))
X+ (error "Complex number is incomplete"))
X+ ((eq (nth 1 a) 'vec)
X+ (error "Vector is incomplete"))
X+ ((eq (nth 1 a) 'intv)
X+ (error "Interval form is incomplete"))
X+ (t (error "Object is incomplete")))
X+ )
X
X
X
X***************
X*** 755,761 ****
X (let ((action (car list)))
X (cond
X ((eq (car action) 'push)
X! (calc-pop-stack 1 (nth 1 action)))
X ((eq (car action) 'pop)
X (calc-push-list (nth 2 action) (nth 1 action)))
X ((eq (car action) 'set)
X--- 1185,1191 ----
X (let ((action (car list)))
X (cond
X ((eq (car action) 'push)
X! (calc-pop-stack 1 (nth 1 action) t))
X ((eq (car action) 'pop)
X (calc-push-list (nth 2 action) (nth 1 action)))
X ((eq (car action) 'set)
X***************
X*** 847,856 ****
X
X
X
X! ;;;; [calc-arith.el]
X
X ;;; Arithmetic.
X
X (defun calc-min (arg)
X "Compute the minimum of the top two elements of the Calculator stack."
X (interactive "P")
X--- 1277,1299 ----
X
X
X
X! ;;;; [calc-ext.el]
X
X ;;; Arithmetic.
X
X+ (defun calc-f-prefix-help ()
X+ (interactive)
X+ (calc-do-prefix-help
X+ '("miN, maX; Hypot; Im, Re; Sign; [, ] (incr/decr)"
X+ "Gamma, Beta, Erf, besselJ, besselY"
X+ "SHIFT + int-sQrt; Int-log, Exp(x)-1, Ln(x+1); arcTan2"
X+ "SHIFT + Abssqr; Mantissa, eXponent, Scale"
X+ "SHIFT + incomplete: Gamma-P, Beta-I")
X+ "functions" ?f)
X+ )
X+
X+ ;;;; [calc-arith.el]
X+
X (defun calc-min (arg)
X "Compute the minimum of the top two elements of the Calculator stack."
X (interactive "P")
X***************
X*** 883,888 ****
X--- 1326,1341 ----
X (calc-unary-op "sqrt" 'calcFunc-sqrt arg)))
X )
X
X+ (defun calc-isqrt (arg)
X+ "Take the integer square root of the top element of the Calculator stack.
X+ This is the floor of the square root of the number, which must be an integer."
X+ (interactive "P")
X+ (calc-slow-wrapper
X+ (if (calc-is-inverse)
X+ (calc-unary-op "^2" 'calcFunc-sqr arg)
X+ (calc-unary-op "isqt" 'calcFunc-isqrt arg)))
X+ )
X+
X ;;;; [calc-arith.el]
X
X (defun calc-idiv (arg)
X***************
X*** 975,980 ****
X--- 1428,1454 ----
X (calc-unary-op "absq" 'calcFunc-abssqr arg))
X )
X
X+ (defun calc-sign (arg)
X+ "Compute the sign of a number, either +1, -1, or 0."
X+ (interactive "P")
X+ (calc-slow-wrapper
X+ (calc-unary-op "sign" 'calcFunc-sign arg))
X+ )
X+
X+ (defun calc-increment (arg)
X+ "Increment an integer, or increase a float by one unit in the last place."
X+ (interactive "p")
X+ (calc-wrapper
X+ (calc-enter-result 1 "incr" (list 'calcFunc-incr (calc-top-n 1) arg)))
X+ )
X+
X+ (defun calc-decrement (arg)
X+ "Decrement an integer, or decrease a float by one unit in the last place."
X+ (interactive "p")
X+ (calc-wrapper
X+ (calc-enter-result 1 "decr" (list 'calcFunc-decr (calc-top-n 1) arg)))
X+ )
X+
X ;;;; [calc-cplx.el]
X
X (defun calc-argument (arg)
X***************
X*** 1025,1039 ****
X )
X
X (defun calc-log (arg)
X! "Take the logarithm base B of X. B is top-of-stack, X is second-to-top.
X With Inverse flag, computes B^X. (Note that \"^\" would compute X^B.)"
X (interactive "P")
X (calc-slow-wrapper
X (if (calc-is-inverse)
X! (calc-binary-op "Ilog" 'calcFunc-ilog arg)
X (calc-binary-op "log" 'calcFunc-log arg)))
X )
X
X (defun calc-lnp1 (arg)
X "Take the logarithm (ln(x+1)) of one plus the top element of the stack."
X (interactive "P")
X--- 1499,1523 ----
X )
X
X (defun calc-log (arg)
X! "Take the logarithm of X to base B. B is top-of-stack, X is second-to-top.
X With Inverse flag, computes B^X. (Note that \"^\" would compute X^B.)"
X (interactive "P")
X (calc-slow-wrapper
X (if (calc-is-inverse)
X! (calc-binary-op "alog" 'calcFunc-alog arg)
X (calc-binary-op "log" 'calcFunc-log arg)))
X )
X
X+ (defun calc-ilog (arg)
X+ "Take the integer logarithm of X to base B. B is top-of-stack, X is second.
X+ The integer logarithm is the floor of the logarithm; X and B must be integers."
X+ (interactive "P")
X+ (calc-slow-wrapper
X+ (if (calc-is-inverse)
X+ (calc-binary-op "alog" 'calcFunc-alog arg)
X+ (calc-binary-op "ilog" 'calcFunc-ilog arg)))
X+ )
X+
X (defun calc-lnp1 (arg)
X "Take the logarithm (ln(x+1)) of one plus the top element of the stack."
X (interactive "P")
X***************
X*** 1223,1228 ****
X--- 1707,1892 ----
X )
X
X
X+ ;;;; [calc-funcs.el]
X+
X+ (defun calc-inc-gamma (arg)
X+ "Compute the incomplete gamma function, gammaP(a,x).
X+ This is the definition for which P(a,0) = 0, P(a,infinity) = 1.
X+ With Inverse flag, compute the complement gammaQ(a,x) = 1 - gammaP(a,x).
X+ With Hyperbolic flag, unnormalized gammag(a,x) = gammaP(a,x) * gamma(a).
X+ With both flags, unnormalized gammaG(a,x) = gammaQ(a,x) * gamma(a)."
X+ (interactive "P")
X+ (calc-slow-wrapper
X+ (if (calc-is-inverse)
X+ (if (calc-is-hyperbolic)
X+ (calc-binary-op "gamG" 'calcFunc-gammaG arg)
X+ (calc-binary-op "gamQ" 'calcFunc-gammaQ arg))
X+ (if (calc-is-hyperbolic)
X+ (calc-binary-op "gamg" 'calcFunc-gammag arg)
X+ (calc-binary-op "gamP" 'calcFunc-gammaP arg))))
X+ )
X+
X+ (defun calc-erf (arg)
X+ "Compute the error function, erf(x).
X+ With the Inverse flag, compute the complement erfc(x) = 1 - erf(x)."
X+ (interactive "P")
X+ (calc-slow-wrapper
X+ (if (calc-is-inverse)
X+ (calc-unary-op "erfc" 'calcFunc-erfc arg)
X+ (calc-unary-op "erf" 'calcFunc-erf arg)))
X+ )
X+
X+ (defun calc-erfc (arg)
X+ "Compute the complementary error function, erfc(x)."
X+ (interactive "P")
X+ (calc-invert-func)
X+ (calc-erf arg)
X+ )
X+
X+ (defun calc-beta (arg)
X+ "Compute the beta function beta(a,b)."
X+ (interactive "P")
X+ (calc-slow-wrapper
X+ (calc-binary-op "beta" 'calcFunc-beta arg))
X+ )
X+
X+ (defun calc-inc-beta ()
X+ "Compute the incomplete beta function betaI(x,a,b).
X+ With the Hyperbolic flag, unnormalized betaB(x,a,b) = betaI(x,a,b) beta(a,b)."
X+ (interactive)
X+ (calc-slow-wrapper
X+ (if (calc-is-hyperbolic)
X+ (calc-enter-result 3 "betB" (cons 'calcFunc-betaB (calc-top-list-n 3)))
X+ (calc-enter-result 3 "betI" (cons 'calcFunc-betaI (calc-top-list-n 3)))))
X+ )
X+
X+ (defun calc-bessel-J (arg)
X+ "Compute the Bessel function of the first kind J_n(x).
X+ Note that N can be any real, and X can be any complex number."
X+ (interactive "P")
X+ (calc-slow-wrapper
X+ (calc-binary-op "besJ" 'calcFunc-besJ arg))
X+ )
X+
X+ (defun calc-bessel-Y (arg)
X+ "Compute the Bessel function of the second kind Y_n(x).
X+ Note that N can be any real, and X can be any complex number."
X+ (interactive "P")
X+ (calc-slow-wrapper
X+ (calc-binary-op "besY" 'calcFunc-besY arg))
X+ )
X+
X+ (defun calc-bernoulli-number (arg)
X+ "Compute the Nth Bernoulli number.
X+ With Hyperbolic flag, top-of-stack is X, next-to-top is N; compute
X+ the Nth Bernoulli polynomial."
X+ (interactive "P")
X+ (calc-slow-wrapper
X+ (if (calc-is-hyperbolic)
X+ (calc-binary-op "bern" 'calcFunc-bern arg)
X+ (calc-unary-op "bern" 'calcFunc-bern arg)))
X+ )
X+
X+ (defun calc-euler-number (arg)
X+ "Compute the Nth Euler number.
X+ With Hyperbolic flag, top-of-stack is X, next-to-top is N; compute
X+ the Nth Euler polynomial."
X+ (interactive "P")
X+ (calc-slow-wrapper
X+ (if (calc-is-hyperbolic)
X+ (calc-binary-op "eulr" 'calcFunc-euler arg)
X+ (calc-unary-op "eulr" 'calcFunc-euler arg)))
X+ )
X+
X+ (defun calc-stirling-number (arg)
X+ "Compute the Stirling number of the first kind S(n,m).
X+ N and M are integers, with 0 <= M <= N.
X+ With Hyperbolic flag, compute the stirling number of the second kind."
X+ (interactive "P")
X+ (calc-slow-wrapper
X+ (if (calc-is-hyperbolic)
X+ (calc-binary-op "str2" 'calcFunc-stir2 arg)
X+ (calc-binary-op "str1" 'calcFunc-stir1 arg)))
X+ )
X+
X+ (defun calc-utpb ()
X+ "Compute the upper tail binomial probability distribution.
X+ This is the probability that a binomial random variable for N trails with
X+ probability P per trial greater than or equal to X. X is in top-of-stack;
X+ P is in next-to-top; N is at third level.
X+ The algebraic functional form is utpb(X,N,P).
X+ With Inverse flag, computes the lower tail distribution instead."
X+ (interactive)
X+ (calc-prob-dist "b" 3)
X+ )
X+
X+ (defun calc-utpc ()
X+ "Compute the upper tail Chi-square probability distribution.
X+ This is the probability that a Chi-square random variable with V degrees of
X+ freedom will be greater than X. X is in top-of-stack; V is in next-to-top.
X+ The algebraic functional form is utpc(X,V).
X+ With Inverse flag, computes the lower tail distribution instead."
X+ (interactive)
X+ (calc-prob-dist "c" 2)
X+ )
X+
X+ (defun calc-utpf ()
X+ "Compute the upper tail \"F\" probability distribution.
X+ This is the probability that an F-distributed random variable with V1 degrees
X+ of freedom in the numerator and V2 degrees of freedom in the denominator will
X+ be greater than X. X is in top-of-stack; V2 is in next-to-top; V1 is
X+ in level three.
X+ The algebraic functional form is utpf(X,V1,V2).
X+ With Inverse flag, computes the lower tail distribution instead."
X+ (interactive)
X+ (calc-prob-dist "f" 3)
X+ )
X+
X+ (defun calc-utpn ()
X+ "Compute the upper tail normal (Gaussian) probability distribution.
X+ This is the probability that a normal random variable with mean M and
X+ standard deviation S will be greater than X. X is in top-of-stack;
X+ S is in next-to-top; M is in level three.
X+ The algebraic functional form is utpn(X,M,S).
X+ With Inverse flag, computes the lower tail distribution instead."
X+ (interactive)
X+ (calc-prob-dist "n" 3)
X+ )
X+
X+ (defun calc-utpp ()
X+ "Compute the upper tail Poisson probability distribution.
X+ This is the probability that a Poisson random variable with mean M will
X+ be greater than X. X is in top-of-stack; M is in next-to-top.
X+ The algebraic functional form is utpb(X,M).
X+ With Inverse flag, computes the lower tail distribution instead."
X+ (interactive)
X+ (calc-prob-dist "p" 2)
X+ )
X+
X+ (defun calc-utpt ()
X+ "Compute the upper tail Student's \"t\" probability distribution.
X+ This is the probability that a Student's random variable with V degrees of
X+ freedom will be greater than T. T is in top-of-stack; V is in next-to-top.
X+ The algebraic functional form is utpb(T,V).
X+ With Inverse flag, computes the lower tail distribution instead."
X+ (interactive)
X+ (calc-prob-dist "t" 2)
X+ )
X+
X+ (defun calc-prob-dist (letter nargs)
X+ (calc-slow-wrapper
X+ (if (calc-is-inverse)
X+ (calc-enter-result nargs (concat "ltp" letter)
X+ (append (list (intern (concat "calcFunc-ltp" letter))
X+ (calc-top-n 1))
X+ (calc-top-list-n (1- nargs) 2)))
X+ (calc-enter-result nargs (concat "utp" letter)
X+ (append (list (intern (concat "calcFunc-utp" letter))
X+ (calc-top-n 1))
X+ (calc-top-list-n (1- nargs) 2)))))
X+ )
X+
X+
X
X ;;;; [calc-store.el]
X
X***************
X*** 1261,1267 ****
X (if (equal var "")
X ()
X (let* ((ivar (intern var))
X! (ival (if (boundp ivar) (symbol-value ivar) nil)))
X (if (null oper)
X (set ivar (calc-top 1))
X (if (null ival)
X--- 1925,1931 ----
X (if (equal var "")
X ()
X (let* ((ivar (intern var))
X! (ival (calc-var-value ivar)))
X (if (null oper)
X (set ivar (calc-top 1))
X (if (null ival)
X***************
X*** 1347,1355 ****
X (if (equal var "")
X ()
X (setq ivar (intern var))
X! (if (not (and (boundp ivar) ivar))
X! (error "No such variable"))
X! (let ((ival (symbol-value ivar)))
X (if (stringp ival)
X (setq ival (math-read-expr ival)))
X (if (eq (car-safe ival) 'error)
X--- 2011,2019 ----
X (if (equal var "")
X ()
X (setq ivar (intern var))
X! (let ((ival (calc-var-value ivar)))
X! (or ival
X! (error "No such variable"))
X (if (stringp ival)
X (setq ival (math-read-expr ival)))
X (if (eq (car-safe ival) 'error)
X***************
X*** 1389,1394 ****
X--- 2053,2068 ----
X (makunbound ivar)))))))
X )
X
X+ ;;;; [calc-ext.el]
X+
X+ (defun calc-var-value (v)
X+ (and (boundp v)
X+ (symbol-value v)
X+ (if (symbolp (symbol-value v))
X+ (set v (funcall (symbol-value v)))
X+ (symbol-value v)))
X+ )
X+
X
X
X
X***************
X*** 1508,1513 ****
X--- 2182,2189 ----
X (t s))
X )
X
X+ ;;;; [calc-ext.el]
X+
X (defun calc-grab-region (top bot arg)
X "Parse the region as a matrix of numbers and push it on the Calculator stack.
X This is intended to be used in a non-Calculator buffer!
X***************
X*** 1529,1551 ****
X brackets. If a stack-style line number (as in \"23: \") is present it is
X first removed."
X (interactive "r\nP")
X (and (memq major-mode '(calc-mode calc-trail-mode))
X (error "This command works only in a regular text buffer."))
X (let* ((col1 (save-excursion (goto-char top) (current-column)))
X (col2 (save-excursion (goto-char bot) (current-column)))
X (from-buffer (current-buffer))
X data mat vals lnum pt pos)
X! (if (= col1 col2)
X! (save-excursion
X! (or (= col1 0)
X! (error "Point and mark must be at beginning of line, or define a rectangle"))
X! (goto-char top)
X! (while (< (point) bot)
X! (setq pt (point))
X! (forward-line 1)
X! (setq data (cons (buffer-substring pt (1- (point))) data)))
X! (setq data (nreverse data)))
X! (setq data (extract-rectangle top bot)))
X (calc)
X (setq mat (list 'vec)
X lnum 0)
X--- 2205,2237 ----
X brackets. If a stack-style line number (as in \"23: \") is present it is
X first removed."
X (interactive "r\nP")
X+ (calc-do-grab-region top bot arg)
X+ )
X+
X+ ;;;; [calc-yank.el]
X+
X+ (defun calc-do-grab-region (top bot arg)
X (and (memq major-mode '(calc-mode calc-trail-mode))
X (error "This command works only in a regular text buffer."))
X (let* ((col1 (save-excursion (goto-char top) (current-column)))
X (col2 (save-excursion (goto-char bot) (current-column)))
X (from-buffer (current-buffer))
X+ (linear (consp arg))
X data mat vals lnum pt pos)
X! (if linear
X! (setq data (list (buffer-substring top bot))
X! arg -1)
X! (if (= col1 col2)
X! (save-excursion
X! (or (= col1 0)
X! (error "Point and mark must be at beginning of line, or define a rectangle"))
X! (goto-char top)
X! (while (< (point) bot)
X! (setq pt (point))
X! (forward-line 1)
X! (setq data (cons (buffer-substring pt (1- (point))) data)))
X! (setq data (nreverse data)))
X! (setq data (extract-rectangle top bot))))
X (calc)
X (setq mat (list 'vec)
X lnum 0)
X***************
X*** 1594,1600 ****
X data (cdr data)
X lnum (1+ lnum)))
X (calc-wrapper
X! (calc-enter-result 0 "grab" (nreverse mat))))
X )
X
X (defun calc-copy-to-buffer (nn)
X--- 2280,2286 ----
X data (cdr data)
X lnum (1+ lnum)))
X (calc-wrapper
X! (calc-enter-result 0 "grab" (if linear (car mat) (nreverse mat)))))
X )
X
X (defun calc-copy-to-buffer (nn)
X***************
X*** 1675,1688 ****
X With a zero prefix, edit all stack elements.
X Type RET or LFD or C-c C-c to finish editing."
X (interactive "p")
X! (calc-wrapper
X! (if (= n 0)
X (setq n (calc-stack-size)))
X! (if (< n 0)
X! (error "Argument must be positive or zero"))
X! (let ((list (mapcar (function (lambda (x) (math-format-flat-expr x 0)))
X! (calc-top-list n))))
X! (calc-edit-mode (list 'calc-finish-stack-edit n))
X (while list
X (insert (car list) "\n")
X (setq list (cdr list)))))
X--- 2361,2389 ----
X With a zero prefix, edit all stack elements.
X Type RET or LFD or C-c C-c to finish editing."
X (interactive "p")
X! (calc-slow-wrapper
X! (if (eq n 0)
X (setq n (calc-stack-size)))
X! (let* ((flag nil)
X! (list (mapcar (if (> n 1)
X! (function (lambda (x) (math-format-flat-expr x 0)))
X! (function
X! (lambda (x)
X! (math-format-nice-expr
X! (if (and (eq (car-safe x) 'var)
X! (calc-var-value (nth 2 x))
X! (not (eq (car-safe (calc-var-value
X! (nth 2 x)))
X! 'special-const)))
X! (progn
X! (setq flag (list 'quote (nth 2 x)))
X! (calc-var-value (nth 2 x)))
X! x)
X! (screen-width)))))
X! (if (> n 0)
X! (calc-top-list n)
X! (calc-top-list 1 (- n))))))
X! (calc-edit-mode (list 'calc-finish-stack-edit (or flag n)))
X (while list
X (insert (car list) "\n")
X (setq list (cdr list)))))
X***************
X*** 1689,1704 ****
X (calc-show-edit-buffer)
X )
X
X (defvar calc-edit-mode-map nil "Keymap for use by the calc-edit command.")
X (if calc-edit-mode-map
X ()
X (setq calc-edit-mode-map (make-sparse-keymap))
X (define-key calc-edit-mode-map "\n" 'calc-edit-finish)
X! (define-key calc-edit-mode-map "\r" 'calc-edit-finish)
X (define-key calc-edit-mode-map "\C-c\C-c" 'calc-edit-finish)
X )
X
X! (defun calc-edit-mode (&optional handler)
X "Calculator editing mode. Press RET, LFD, or C-c C-c to finish.
X To cancel the edit, simply kill the *Calc Edit* buffer."
X (interactive)
X--- 2390,2413 ----
X (calc-show-edit-buffer)
X )
X
X+ (defun calc-alg-edit (str)
X+ (calc-edit-mode '(calc-finish-stack-edit 0))
X+ (calc-show-edit-buffer)
X+ (insert str "\n")
X+ (backward-char 1)
X+ (calc-set-command-flag 'do-edit)
X+ )
X+
X (defvar calc-edit-mode-map nil "Keymap for use by the calc-edit command.")
X (if calc-edit-mode-map
X ()
X (setq calc-edit-mode-map (make-sparse-keymap))
X (define-key calc-edit-mode-map "\n" 'calc-edit-finish)
X! (define-key calc-edit-mode-map "\r" 'calc-edit-return)
X (define-key calc-edit-mode-map "\C-c\C-c" 'calc-edit-finish)
X )
X
X! (defun calc-edit-mode (&optional handler allow-ret)
X "Calculator editing mode. Press RET, LFD, or C-c C-c to finish.
X To cancel the edit, simply kill the *Calc Edit* buffer."
X (interactive)
X***************
X*** 1720,1727 ****
X (setq calc-edit-handler handler)
X (make-local-variable 'calc-restore-trail)
X (setq calc-restore-trail calc-display-trail)
X (erase-buffer)
X! (insert "Calc Edit Mode. Press RET to finish. Press C-x k RET to cancel.\n"))
X )
X (put 'calc-edit-mode 'mode-class 'special)
X
X--- 2429,2440 ----
X (setq calc-edit-handler handler)
X (make-local-variable 'calc-restore-trail)
X (setq calc-restore-trail calc-display-trail)
X+ (make-local-variable 'calc-allow-ret)
X+ (setq calc-allow-ret allow-ret)
X (erase-buffer)
X! (insert "Calc Edit Mode. Press "
X! (if allow-ret "C-c C-c" "RET")
X! " to finish. Press C-x k RET to cancel.\n"))
X )
X (put 'calc-edit-mode 'mode-class 'special)
X
X***************
X*** 1737,1742 ****
X--- 2450,2462 ----
X (forward-line 1)
X )
X
X+ (defun calc-edit-return ()
X+ (interactive)
X+ (if (and (boundp 'calc-allow-ret) calc-allow-ret)
X+ (newline)
X+ (calc-edit-finish))
X+ )
X+
X (defun calc-edit-finish ()
X "Finish calc-edit mode. Parse buffer contents and push them on the stack."
X (interactive)
X***************
X*** 1749,1756 ****
X (original calc-original-buffer)
X (disp-trail calc-restore-trail))
X (save-excursion
X! (set-buffer original)
X! (if (not (eq major-mode 'calc-mode))
X (error "Original calculator buffer has been corrupted.")))
X (goto-char (point-min))
X (if (looking-at "Calc Edit")
X--- 2469,2478 ----
X (original calc-original-buffer)
X (disp-trail calc-restore-trail))
X (save-excursion
X! (if (or (null (buffer-name original))
X! (progn
X! (set-buffer original)
X! (not (eq major-mode 'calc-mode))))
X (error "Original calculator buffer has been corrupted.")))
X (goto-char (point-min))
X (if (looking-at "Calc Edit")
X***************
X*** 1759,1766 ****
X (eval calc-edit-handler))
X (switch-to-buffer original)
X (kill-buffer buf)
X! (calc-wrapper
X! (if disp-trail
X (calc-trail-display 1 t))))
X )
X
X--- 2481,2488 ----
X (eval calc-edit-handler))
X (switch-to-buffer original)
X (kill-buffer buf)
X! (if disp-trail
X! (calc-wrapper
X (calc-trail-display 1 t))))
X )
X
X***************
X*** 1770,1807 ****
X (start (point))
X pos)
X (while (setq pos (string-match "\n." str))
X! (aset str pos ?\,))
X! (set-buffer calc-original-buffer)
X (let ((vals (math-read-exprs str)))
X (if (eq (car-safe vals) 'error)
X (progn
X! (set-buffer buf)
X (goto-char (+ start (nth 1 vals)))
X (error (nth 2 vals))))
X! (calc-wrapper
X! (calc-enter-result num "edit" vals))))
X )
X
X
X
X
X ;;;; [calc-ext.el]
X
X ;;; Algebra commands.
X
X (defun calc-a-prefix-help ()
X (interactive)
X (calc-do-prefix-help
X! '("Simplify, Extended-simplify; eXpand, Collect"
X! "Derivative, Integral, Taylor; suBstitute; Rewrite"
X! "SHIFT + Solve; Integral-limit"
X "relations: =, # (not =), <, >, [ (< or =), ] (> or =)"
X! "logical: & (and), | (or), ! (not); misc: { (in-set)")
X "algebra" ?a)
X )
X
X ;;;; [calc-alg.el]
X
X (defun calc-simplify ()
X "Simplify the formula on top of the stack."
X (interactive)
X--- 2492,4052 ----
X (start (point))
X pos)
X (while (setq pos (string-match "\n." str))
X! (aset str pos (if (and (integerp num) (> num 1)) ?\, ? )))
X! (switch-to-buffer calc-original-buffer)
X (let ((vals (math-read-exprs str)))
X (if (eq (car-safe vals) 'error)
X (progn
X! (switch-to-buffer buf)
X (goto-char (+ start (nth 1 vals)))
X (error (nth 2 vals))))
X! (if (symbolp num)
X! (set num (car vals))
X! (calc-wrapper
X! (if disp-trail
X! (calc-trail-display 1 t))
X! (if (>= num 0)
X! (calc-enter-result num "edit" vals)
X! (calc-enter-result 1 "edit" vals (- num)))))))
X! )
X!
X!
X!
X!
X! ;;;; [calc-ext.el]
X!
X! ;;; Selection commands.
X!
X! (defun calc-j-prefix-help ()
X! (interactive)
X! (calc-do-prefix-help
X! '("Select, Additional, Once; eVal; Rewrite"
X! "More, Less, 1-9, Next, Previous"
X! "Unselect, Clear; Display; Enable; Breakable"
X! "' (replace), ` (edit), +, -, *, /, RET (grab), DEL"
X! "SHIFT + swap: Left, Right; maybe: Select, Once"
X! "SHIFT + Commute, Merge, Distrib, jump-Eqn, Isolate"
X! "SHIFT + Negate, & (invert); Unpack")
X! "select" ?j)
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! ;;;; [calc-sel.el]
X!
X! (defun calc-select-here (num &optional once keep)
X! "Select the smallest sub-formula surrounding point, or whole formula.
X! With a prefix argument, select Nth-larger-than-smallest sub-formula."
X! (interactive "P")
X! (calc-wrapper
X! (calc-prepare-selection)
X! (let ((found (calc-find-selected-part))
X! (entry calc-selection-cache-entry))
X! (or (and keep (nth 2 entry))
X! (progn
X! (if once (progn
X! (setq calc-keep-selection nil)
X! (message "(Selection will apply to next command only)")))
X! (calc-change-current-selection
X! (if found
X! (if (and num (> (setq num (prefix-numeric-value num)) 0))
X! (progn
X! (while (and (>= (setq num (1- num)) 0)
X! (not (eq found (car entry))))
X! (setq found (calc-find-assoc-parent-formula
X! (car entry) found)))
X! found)
X! (calc-grow-assoc-formula (car entry) found))
X! (car entry)))))))
X! )
X!
X! (defun calc-select-once (num)
X! "Like calc-select-here, but the selection applies only to the next command."
X! (interactive "P")
X! (calc-select-here num t)
X! )
X!
X! (defun calc-select-here-maybe (num)
X! "Like calc-select-here, but keep existing selection if any."
X! (interactive "P")
X! (calc-select-here num nil t)
X! )
X!
X! (defun calc-select-once-maybe (num)
X! "Like calc-select-once, but keeps existing selection if any."
X! (interactive "P")
X! (calc-select-once num t t)
X! )
X!
X! (defun calc-select-additional ()
X! "Enlarge current selection to contain current point."
X! (interactive)
X! (calc-wrapper
X! (let (calc-keep-selection)
X! (calc-prepare-selection))
X! (let ((found (calc-find-selected-part))
X! (entry calc-selection-cache-entry))
X! (calc-change-current-selection
X! (if found
X! (let ((sel (nth 2 entry)))
X! (if sel
X! (progn
X! (while (not (or (eq sel (car entry))
X! (calc-find-sub-formula sel found)))
X! (setq sel (calc-find-assoc-parent-formula
X! (car entry) sel)))
X! sel)
X! (calc-grow-assoc-formula (car entry) found)))
X! (car entry)))))
X! )
X!
X! (defun calc-select-more (num)
X! "Enlarge the current selection by N levels.
X! If there is no current selection, same as calc-select-here."
X! (interactive "P")
X! (calc-wrapper
X! (calc-prepare-selection)
X! (let ((entry calc-selection-cache-entry))
X! (if (nth 2 entry)
X! (let ((sel (nth 2 entry)))
X! (while (and (not (eq sel (car entry)))
X! (>= (setq num (1- (prefix-numeric-value num))) 0))
X! (setq sel (calc-find-assoc-parent-formula (car entry) sel)))
X! (calc-change-current-selection sel))
X! (calc-select-here num))))
X! )
X!
X! (defun calc-select-less (num)
X! "Reduce the current selection by N levels around point."
X! (interactive "p")
X! (calc-wrapper
X! (calc-prepare-selection)
X! (let ((found (calc-find-selected-part))
X! (entry calc-selection-cache-entry))
X! (calc-change-current-selection
X! (and found
X! (let ((sel (nth 2 entry))
X! old index op)
X! (while (and sel
X! (not (eq sel found))
X! (>= (setq num (1- num)) 0))
X! (setq old sel
X! index (calc-find-sub-formula sel found))
X! (and (setq sel (and index (nth index old)))
X! calc-assoc-selections
X! (setq op (assq (car-safe sel) calc-assoc-ops))
X! (memq (car old) (nth index op))
X! (setq num (1+ num))))
X! sel)))))
X! )
X!
X! (defun calc-select-part (num)
X! "Reduce the current selection to the Nth immediate sub-formula."
X! (interactive "P")
X! (or num (setq num (- last-command-char ?0)))
X! (calc-wrapper
X! (calc-prepare-selection)
X! (let ((sel (calc-find-nth-part (or (nth 2 calc-selection-cache-entry)
X! (car calc-selection-cache-entry))
X! num)))
X! (if sel
X! (calc-change-current-selection sel)
X! (error "%d is not a valid sub-formula index" num))))
X! )
X!
X! (defun calc-find-nth-part (expr num)
X! (if (and calc-assoc-selections
X! (assq (car-safe expr) calc-assoc-ops))
X! (let (op)
X! (calc-find-nth-part-rec expr))
X! (if (eq (car-safe expr) 'intv)
X! (and (>= num 1) (<= num 2) (nth (1+ num) expr))
X! (and (not (Math-primp expr)) (>= num 1) (< num (length expr))
X! (nth num expr))))
X! )
X!
X! (defun calc-find-nth-part-rec (expr) ; uses num, op
X! (or (if (and (setq op (assq (car-safe (nth 1 expr)) calc-assoc-ops))
X! (memq (car expr) (nth 1 op)))
X! (calc-find-nth-part-rec (nth 1 expr))
X! (and (= (setq num (1- num)) 0)
X! (nth 1 expr)))
X! (if (and (setq op (assq (car-safe (nth 2 expr)) calc-assoc-ops))
X! (memq (car expr) (nth 2 op)))
X! (calc-find-nth-part-rec (nth 2 expr))
X! (and (= (setq num (1- num)) 0)
X! (nth 2 expr))))
X! )
X!
X! (defun calc-select-next (num)
X! "Advance selection to Nth next sub-formula."
X! (interactive "p")
X! (if (< num 0)
X! (calc-select-previous (- num))
X! (calc-wrapper
X! (calc-prepare-selection)
X! (let* ((entry calc-selection-cache-entry)
X! (sel (nth 2 entry)))
X! (if sel
X! (progn
X! (while (>= (setq num (1- num)) 0)
X! (let* ((parent (calc-find-parent-formula (car entry) sel))
X! (p parent)
X! op)
X! (and (eq p t) (setq p nil))
X! (while (and (setq p (cdr p))
X! (not (eq (car p) sel))))
X! (if (cdr p)
X! (setq sel (or (and calc-assoc-selections
X! (setq op (assq (car-safe (nth 1 p))
X! calc-assoc-ops))
X! (memq (car parent) (nth 2 op))
X! (nth 1 (nth 1 p)))
X! (nth 1 p)))
X! (if (and calc-assoc-selections
X! (setq op (assq (car-safe parent) calc-assoc-ops))
X! (consp (setq p (calc-find-parent-formula
X! (car entry) parent)))
X! (eq (nth 1 p) parent)
X! (memq (car p) (nth 1 op)))
X! (setq sel (nth 2 p))
X! (error "No \"next\" sub-formula")))))
X! (calc-change-current-selection sel))
X! (if (Math-primp (car entry))
X! (calc-change-current-selection (car entry))
X! (calc-select-part num))))))
X! )
X!
X! (defun calc-select-previous (num)
X! "Move selection back to Nth previous sub-formula."
X! (interactive "p")
X! (if (< num 0)
X! (calc-select-next (- num))
X! (calc-wrapper
X! (calc-prepare-selection)
X! (let* ((entry calc-selection-cache-entry)
X! (sel (nth 2 entry)))
X! (if sel
X! (progn
X! (while (>= (setq num (1- num)) 0)
X! (let* ((parent (calc-find-parent-formula (car entry) sel))
X! (p (cdr-safe parent))
X! (prev nil)
X! op)
X! (if (eq (car-safe parent) 'intv) (setq p (cdr p)))
X! (while (and (not (eq (car p) sel))
X! (setq prev (car p)
X! p (cdr p))))
X! (if prev
X! (setq sel (or (and calc-assoc-selections
X! (setq op (assq (car-safe prev)
X! calc-assoc-ops))
X! (memq (car parent) (nth 1 op))
X! (nth 2 prev))
X! prev))
X! (if (and calc-assoc-selections
X! (setq op (assq (car-safe parent) calc-assoc-ops))
X! (consp (setq p (calc-find-parent-formula
X! (car entry) parent)))
X! (eq (nth 2 p) parent)
X! (memq (car p) (nth 2 op)))
X! (setq sel (nth 1 p))
X! (error "No \"previous\" sub-formula")))))
X! (calc-change-current-selection sel))
X! (if (Math-primp (car entry))
X! (calc-change-current-selection (car entry))
X! (let ((len (if (and calc-assoc-selections
X! (assq (car (car entry)) calc-assoc-ops))
X! (let (op (num 0))
X! (calc-find-nth-part-rec (car entry))
X! (- 1 num))
X! (length (car entry)))))
X! (calc-select-part (- len num))))))))
X! )
X!
X! (defun calc-find-parent-formula (expr part)
X! (cond ((eq expr part) t)
X! ((Math-primp expr) nil)
X! (t
X! (let ((p expr) res)
X! (while (and (setq p (cdr p))
X! (not (setq res (calc-find-parent-formula
X! (car p) part)))))
X! (and p
X! (if (eq res t) expr res)))))
X! )
X!
X! ;;; In the following table, ( OP LOPS ROPS ) means that if an OP
X! ;;; term appears as the first argument to any LOPS term, or as the
X! ;;; second argument to any ROPS term, then they should be treated
X! ;;; as one large term for purposes of associative selection.
X! (defconst calc-assoc-ops '( ( + ( + - ) ( + ) )
X! ( - ( + - ) ( + ) )
X! ( * ( * ) ( * ) )
X! ( / ( / ) ( ) )
X! ( | ( | ) ( | ) )
X! ( calcFunc-land ( calcFunc-land )
X! ( calcFunc-land ) )
X! ( calcFunc-lor ( calcFunc-lor )
X! ( calcFunc-lor ) ) ))
X!
X! (defun calc-find-assoc-parent-formula (expr part)
X! (calc-grow-assoc-formula expr (calc-find-parent-formula expr part))
X! )
X!
X! (defun calc-grow-assoc-formula (expr part)
X! (if calc-assoc-selections
X! (let ((op (assq (car-safe part) calc-assoc-ops)))
X! (if op
X! (let (new)
X! (while (and (consp (setq new (calc-find-parent-formula
X! expr part)))
X! (memq (car new)
X! (nth (calc-find-sub-formula new part) op)))
X! (setq part new))))
X! part)
X! part)
X! )
X!
X! (defun calc-find-sub-formula (expr part)
X! (cond ((eq expr part) t)
X! ((Math-primp expr) nil)
X! (t
X! (let ((num 1))
X! (while (and (setq expr (cdr expr))
X! (not (calc-find-sub-formula (car expr) part)))
X! (setq num (1+ num)))
X! (and expr num))))
X! )
X!
X! (defun calc-unselect (num)
X! "Deselect any current sub-formula selection for this formula.
X! With a prefix argument, deselect Nth stack entry, else use entry at cursor."
X! (interactive "P")
X! (calc-wrapper
X! (calc-prepare-selection num)
X! (calc-change-current-selection nil))
X! )
X!
X! (defun calc-clear-selections ()
X! "Deselect all selected sub-formulas on the stack."
X! (interactive)
X! (calc-wrapper
X! (let ((limit (calc-stack-size))
X! (n 1))
X! (while (<= n limit)
X! (if (calc-top n 'sel)
X! (progn
X! (calc-prepare-selection n)
X! (calc-change-current-selection nil)))
X! (setq n (1+ n))))
X! (calc-clear-command-flag 'position-point))
X! )
X!
X! (defun calc-show-selections (arg)
X! "Toggle between showing selected or non-selected portions of a formula."
X! (interactive "P")
X! (calc-wrapper
X! (calc-preserve-point)
X! (setq calc-show-selections (if arg
X! (> (prefix-numeric-value arg) 0)
X! (not calc-show-selections)))
X! (let ((p calc-stack))
X! (while (and p
X! (or (null (nth 2 (car p)))
X! (equal (car p) calc-selection-cache-entry)))
X! (setq p (cdr p)))
X! (if p
X! (let ((calc-selection-cache-default-entry calc-selection-cache-entry))
X! (calc-refresh))
X! (and calc-selection-cache-entry
X! (let ((sel (nth 2 calc-selection-cache-entry)))
X! (setcar (nthcdr 2 calc-selection-cache-entry) nil)
X! (calc-change-current-selection sel)))))
X! (message (if calc-show-selections
X! "Displaying only selected part of formulas"
X! "Displaying all but selected part of formulas")))
X! )
X!
X! (defun calc-preserve-point ()
X! (or (looking-at "\\.\n+\\'")
X! (progn
X! (setq calc-final-point-line (+ (count-lines (point-min) (point))
X! (if (bolp) 1 0))
X! calc-final-point-column (current-column))
X! (calc-set-command-flag 'position-point)))
X! )
X!
X! (defun calc-enable-selections (arg)
X! "Toggle whether selections affect stack operations."
X! (interactive "P")
X! (calc-wrapper
X! (calc-preserve-point)
X! (setq calc-use-selections (if arg
X! (> (prefix-numeric-value arg) 0)
X! (not calc-use-selections)))
SHAR_EOF
echo "End of part 4, continue with part 5"
echo "5" > s2_seq_.tmp
exit 0
More information about the Comp.sources.misc
mailing list