daveg@csvax.cs.caltech.edu (David Gillespie) (10/15/90)
Posting-number: Volume 15, Issue 33 Submitted-by: daveg@csvax.cs.caltech.edu (David Gillespie) Archive-name: calc-1.05/part06 #!/bin/sh # this is part 6 of a multipart archive # do not concatenate these parts, unpack them in order with /bin/sh # file calc.patch continued # CurArch=6 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! "Not breaking long lines in Stack display."))) X ) X X+ ;;;; [calc-vec.el] X+ X (defun calc-display-strings (n) X "Toggle display of vectors of byte-sized integers as strings. X With positive numeric prefix, turn mode on. X*************** X*** 2484,2492 **** X (setq calc-display-strings (if n X (> (prefix-numeric-value n) 0) X (not calc-display-strings))) X! (calc-refresh)) X ) X X (defun calc-left-justify () X "Display stack entries left-justified in the window." X (interactive) X--- 4852,4865 ---- X (setq calc-display-strings (if n X (> (prefix-numeric-value n) 0) X (not calc-display-strings))) X! (calc-refresh) X! (message (if calc-display-strings X! "Displaying vectors of integers as quoted strings." X! "Displaying vectors of integers normally."))) X ) X X+ ;;;; [calc-mode.el] X+ X (defun calc-left-justify () X "Display stack entries left-justified in the window." X (interactive) X*************** X*** 2717,2723 **** X (max 1 (calc-locate-cursor-element (point))))) X (if (= newtop oldtop) X () X! (calc-pop-stack 1 oldtop) X (calc-push-list '(top-of-stack) newtop) X (if calc-line-numbering X (calc-refresh)))) X--- 5090,5096 ---- X (max 1 (calc-locate-cursor-element (point))))) X (if (= newtop oldtop) X () X! (calc-pop-stack 1 oldtop t) X (calc-push-list '(top-of-stack) newtop) X (if calc-line-numbering X (calc-refresh)))) X*************** X*** 3107,3120 **** X X ;;;; [calc-ext.el] X X ;;; Combinatorics X X (defun calc-k-prefix-help () X (interactive) X (calc-do-prefix-help X! '("GCD, LCM; Binomial, Dbl-fact; Random, random-Again" X "Factors, Prime-test, Next-prime, Totient, Moebius" X! "SHIFT + extended-GCD") X "combinatorics" ?k) X ) X X--- 5480,6557 ---- X X ;;;; [calc-ext.el] X X+ ;;; Graphics X+ X+ (defun calc-g-prefix-help () X+ (interactive) X+ (calc-do-prefix-help X+ '("Fast; Add, Delete, Juggle; Plot, Clear" X+ "Header, Name, Grid, Key, Numpts" X+ "View-commands, X-display" X+ "x-axis: Range, Title, Log; lineStyle" X+ "SHIFT + y-axis: Range, Title, Log; pointStyle" X+ "SHIFT + Print; Device, Output-file; X-geometry" X+ "SHIFT + Command, Kill, View-trail") X+ "graph" ?g) X+ ) X+ X+ (defvar calc-gnuplot-process nil) X+ X+ ;;;; [calc-graph.el] X+ X+ ;;; Note that some of the following initial values also occur in calc.el. X+ (defvar calc-gnuplot-tempfile "/tmp/calc") X+ X+ (defvar calc-gnuplot-default-device "default") X+ (defvar calc-gnuplot-default-output "/dev/null") X+ (defvar calc-gnuplot-print-device "postscript") X+ (defvar calc-gnuplot-print-output "auto") X+ X+ (defvar calc-gnuplot-display (getenv "DISPLAY")) X+ (defvar calc-gnuplot-geometry nil) X+ X+ (defvar calc-graph-default-resolution 15) X+ (defvar calc-graph-default-precision 5) X+ X+ (defvar calc-gnuplot-buffer nil) X+ (defvar calc-gnuplot-input nil) X+ X+ (defvar calc-gnuplot-last-error-pos 1) X+ (defvar calc-graph-last-device nil) X+ (defvar calc-graph-last-output nil) X+ (defvar calc-graph-var-cache nil) X+ (defvar calc-graph-data-cache nil) X+ (defvar calc-graph-data-cache-limit 10) X+ X+ (defun calc-graph-fast (many) X+ "Graph the two vectors or other x/y values on the top of the stack. X+ This is shorthand for calc-graph-delete for all existing curves followed X+ by calc-graph-add and calc-graph-plot." X+ (interactive "P") X+ (let ((calc-graph-no-auto-view t)) X+ (calc-graph-delete t) X+ (calc-graph-add many) X+ (calc-graph-plot nil)) X+ ) X+ X+ (defun calc-graph-delete (all) X+ "Delete the most recently added curve from the current graph. X+ With a numeric prefix argument, delete all curves from the graph." X+ (interactive "P") X+ (calc-wrapper X+ (calc-graph-init) X+ (save-excursion X+ (set-buffer calc-gnuplot-input) X+ (and (calc-graph-find-plot t all) X+ (progn X+ (if (looking-at "plot") X+ (progn X+ (setq calc-graph-var-cache nil) X+ (delete-region (point) (point-max))) X+ (delete-region (point) (1- (point-max)))))) X+ (calc-graph-view-commands))) X+ ) X+ X+ (defun calc-graph-find-plot (&optional before all) X+ (goto-char (point-min)) X+ (and (re-search-forward "^plot[ \t]+" nil t) X+ (let ((beg (point))) X+ (goto-char (point-max)) X+ (if (or all X+ (not (search-backward "," nil t)) X+ (< (point) beg)) X+ (progn X+ (goto-char beg) X+ (if before X+ (beginning-of-line))) X+ (or before X+ (re-search-forward ",[ \t]+"))) X+ t)) X+ ) X+ X+ (defun calc-graph-add (many) X+ "Add a curve to the current graph. X+ The y data is taken from top of stack; the x data is taken from second-to-top. X+ The x data may be a vector or an interval. X+ The y data may be a vector or a formula in a single variable. X+ Each may also be the name of a variable that contains a suitable value. X+ X+ With any numeric prefix argument, the value on the top of the stack is X+ a vector of y-data values, all of which are added (with the same common X+ x data) as separate curves." X+ (interactive "P") X+ (calc-wrapper X+ (calc-graph-init) X+ (let ((xdata (calc-graph-lookup (calc-top-n 2))) X+ (ylist (calc-top-n 1)) X+ ydata) X+ (if many X+ (if (eq (car-safe ylist) 'vec) X+ (setq ylist (cdr ylist)) X+ (error "Y argument must be a vector"))) X+ (while ylist X+ (if many X+ (setq ydata (calc-graph-lookup (car ylist)) X+ ylist (cdr ylist)) X+ (setq ydata (calc-graph-lookup ylist) X+ ylist nil)) X+ (save-excursion X+ (set-buffer calc-gnuplot-input) X+ (goto-char (point-min)) X+ (if (re-search-forward "^plot[ \t]" nil t) X+ (progn X+ (end-of-line) X+ (insert ", ")) X+ (goto-char (point-max)) X+ (or (eq (preceding-char) ?\n) X+ (insert "\n")) X+ (insert "plot \n") X+ (forward-char -1)) X+ (insert "{" (symbol-name (nth 1 xdata)) X+ ":" (symbol-name (nth 1 ydata)) "} " X+ "title \"" (symbol-name (nth 1 ydata)) "\" " X+ "with " X+ (if (eq (car-safe (calc-var-value (nth 2 ydata))) 'vec) X+ "linespoints" X+ "lines"))))) X+ (calc-graph-view-commands)) X+ ) X+ X+ (defun calc-graph-lookup (thing) X+ (if (and (eq (car-safe thing) 'var) X+ (calc-var-value (nth 2 thing))) X+ thing X+ (let ((found (assoc thing calc-graph-var-cache))) X+ (or found X+ (progn X+ (setq varname (concat "PlotData" X+ (int-to-string X+ (1+ (length calc-graph-var-cache)))) X+ var (list 'var (intern varname) X+ (intern (concat "var-" varname))) X+ found (cons thing var) X+ calc-graph-var-cache (cons found calc-graph-var-cache)) X+ (set (nth 2 var) thing))) X+ (cdr found))) X+ ) X+ X+ (defun calc-graph-juggle () X+ "Move the last curve on the list to the front, exposing the next-to-last." X+ (interactive) X+ (calc-graph-init) X+ (save-excursion X+ (let (base) X+ (set-buffer calc-gnuplot-input) X+ (and (calc-graph-find-plot t t) X+ (progn X+ (setq base (point)) X+ (calc-graph-find-plot t nil) X+ (or (eq base (point)) X+ (let ((str (buffer-substring (+ (point) 2) (1- (point-max))))) X+ (delete-region (point) (1- (point-max))) X+ (goto-char (+ base 5)) X+ (insert str ", "))))))) X+ ) X+ X+ (defun calc-graph-print () X+ "Print the current graph. X+ This creates the same graph that calc-graph-plot would create, except X+ that it uses the printer instead of the screen. This command overrides X+ any previous calc-graph-device or calc-graph-output commands." X+ (interactive) X+ (calc-graph-plot t) X+ ) X+ X+ (defun calc-graph-plot (flag &optional printing) X+ "Draw a graph according to the current plotting parameters. X+ Use calc-graph-add to add curves to the current graph. X+ Use other calc-graph-... commands to set titles, styles, etc. X+ A negative prefix argument forces recomputation of all curve data. X+ A positive prefix argument causes existing data to be further refined." X+ (interactive "P") X+ (calc-slow-wrapper X+ (let ((calcbuf (current-buffer)) X+ (tempbuf (get-buffer-create "*Gnuplot Temp-2*")) X+ (tempbuftop 1) X+ (tempfiles nil) X+ (tempoutfile nil) X+ (curve-num 0) X+ (refine (and flag (> (prefix-numeric-value flag) 0))) X+ (recompute (and flag (< (prefix-numeric-value flag) 0))) X+ resolution precision samples-pos) X+ (save-excursion X+ (calc-graph-init) X+ (set-buffer tempbuf) X+ (erase-buffer) X+ (set-buffer calc-gnuplot-input) X+ (let ((str (buffer-string))) X+ (set-buffer (get-buffer-create "*Gnuplot Temp*")) X+ (erase-buffer) X+ (insert "# (Note: This is a temporary copy---do not edit!)\n" X+ "set noarrow\nset nolabel\n" X+ "set autoscale xy\nset nologscale xy\n" X+ "set xlabel\nset ylabel\nset title\n" X+ "set noclip points\nset clip one\nset clip two\n" X+ "set format \"%g\"\nset tics\nset xtics\nset ytics\n" X+ "set data style linespoints\n" X+ "set nogrid\nset nokey\nset nopolar\n") X+ (setq samples-pos (point)) X+ (insert "\n\n" str)) X+ (let ((calc-gnuplot-input (current-buffer)) X+ (calc-graph-no-auto-view t) X+ device output) X+ (if printing X+ (setq device calc-gnuplot-print-device X+ output calc-gnuplot-print-output) X+ (setq device (calc-graph-find-command "terminal") X+ output (calc-graph-find-command "output")) X+ (if device X+ (setq device (car (read-from-string device))) X+ (setq device calc-gnuplot-default-device)) X+ (if output X+ (setq output (car (read-from-string output))) X+ (setq output calc-gnuplot-default-output))) X+ (if (or (equal device "") (equal device "default")) X+ (setq device (if (and (not printing) X+ (getenv "DISPLAY")) X+ "x11" "postscript"))) X+ (if (stringp output) X+ (if (equal output "auto") X+ (setq tempoutfile (make-temp-file "/tmp/calc") X+ output tempoutfile)) X+ (setq output (eval output))) X+ (or (equal device calc-graph-last-device) X+ (progn X+ (setq calc-graph-last-device device) X+ (calc-gnuplot-command "set terminal" device))) X+ (or (equal output calc-graph-last-output) X+ (progn X+ (setq calc-graph-last-output output) X+ (calc-gnuplot-command "set output" (prin1-to-string output)))) X+ (setq resolution (calc-graph-find-command "samples")) X+ (if resolution X+ (setq resolution (string-to-int resolution)) X+ (setq resolution calc-graph-default-resolution)) X+ (setq precision (calc-graph-find-command "precision")) X+ (if precision X+ (setq precision (string-to-int precision)) X+ (setq precision calc-graph-default-precision)) X+ (calc-graph-set-command "terminal") X+ (calc-graph-set-command "output") X+ (calc-graph-set-command "samples") X+ (calc-graph-set-command "precision")) X+ (and tempoutfile (setq tempfiles (cons tempoutfile tempfiles))) X+ (goto-char samples-pos) X+ (insert "set samples " (int-to-string (max 200 (+ 5 resolution))) "\n") X+ (while (re-search-forward "{\\*[^}]+}[^,\n]*" nil t) X+ (delete-region (match-beginning 0) (match-end 0)) X+ (if (looking-at ",") X+ (delete-char 1) X+ (while (memq (preceding-char) '(?\ ?\t)) X+ (forward-char -1)) X+ (if (eq (preceding-char) ?\,) X+ (delete-backward-char 1)))) X+ (save-excursion X+ (set-buffer calcbuf) X+ (let ((cache-env (list calc-angle-mode X+ calc-complex-mode X+ calc-simplify-mode X+ calc-word-size X+ precision))) X+ (if (and (not recompute) X+ (equal (cdr (car calc-graph-data-cache)) cache-env)) X+ (while (> (length calc-graph-data-cache) X+ calc-graph-data-cache-limit) X+ (setcdr calc-graph-data-cache X+ (cdr (cdr calc-graph-data-cache)))) X+ (setq calc-graph-data-cache (list (cons nil cache-env)))))) X+ (calc-graph-find-plot t t) X+ (while (re-search-forward "{\\([^{}:\n]+\\):\\([^{}:\n]+\\)}" nil t) X+ (setq curve-num (1+ curve-num)) X+ (let* ((xname (buffer-substring (match-beginning 1) X+ (match-end 1))) X+ (xvar (intern (concat "var-" xname))) X+ (xvalue (calc-var-value xvar)) X+ (yname (buffer-substring (match-beginning 2) X+ (match-end 2))) X+ (yvar (intern (concat "var-" yname))) X+ (yvalue (calc-var-value yvar)) X+ filename) X+ (delete-region (match-beginning 0) (match-end 0)) X+ (setq filename (make-temp-name calc-gnuplot-tempfile)) X+ (save-excursion X+ (set-buffer calcbuf) X+ (let (tempbuftop X+ (xp xvalue) X+ (yp yvalue) X+ (xlow nil) (xhigh nil) X+ xvec xval xstep var-DUMMY X+ yvec yval ycache ycacheptr yvector X+ numsteps X+ (stepcount 0) X+ (calc-symbolic-mode nil) X+ (calc-prefer-frac nil) X+ (calc-internal-prec (max 3 precision)) X+ (calc-simplify-mode (and (not (memq calc-simplify-mode X+ '(none num))) X+ calc-simplify-mode)) X+ (blank t) X+ (non-blank nil)) X+ (save-excursion X+ (if (setq yvec (eq (car-safe yvalue) 'vec)) X+ (if (= (setq numsteps (1- (length yvalue))) 0) X+ (error "Can't plot an empty vector") X+ (if (setq xvec (eq (car-safe xvalue) 'vec)) X+ (or (= (1- (length xvalue)) numsteps) X+ (error "%s and %s have different lengths" X+ xname yname)) X+ (if (eq (car-safe xvalue) 'intv) X+ (setq xstep (math-div (math-sub (nth 3 xvalue) X+ (nth 2 xvalue)) X+ (1- numsteps)) X+ xvalue (nth 2 xvalue)) X+ (if (math-realp xvalue) X+ (setq xstep 1) X+ (error "%s is not a suitable basis for %s" X+ xname yname))))) X+ (or (math-realp yvalue) X+ (let ((arglist nil)) X+ (setq yvalue (math-evaluate-expr yvalue)) X+ (calc-default-formula-arglist yvalue) X+ (or arglist X+ (error "%s does not contain any unassigned variables" X+ yname)) X+ (and (cdr arglist) X+ (error "%s contains several variables: %s" X+ yname arglist)) X+ (setq yvalue (math-expr-subst X+ yvalue X+ (list 'var X+ (car arglist) X+ (intern (concat "var-" X+ (symbol-name X+ (car arglist))))) X+ '(var DUMMY var-DUMMY))))) X+ (setq ycache (assoc yvalue calc-graph-data-cache)) X+ (delq ycache calc-graph-data-cache) X+ (nconc calc-graph-data-cache X+ (list (or ycache (setq ycache (list yvalue))))) X+ (if (and (not (setq xvec (eq (car-safe xvalue) 'vec))) X+ refine (cdr (cdr ycache))) X+ (progn X+ (setq ycacheptr (cdr ycache)) X+ (if (and X+ (setq xval (calc-graph-find-command "xrange")) X+ (string-match X+ "\\`\\[\\([0-9.eE+-]*\\):\\([0-9.eE+-]*\\)\\]\\'" X+ xval)) X+ (let ((b2 (match-beginning 2)) X+ (e2 (match-end 2))) X+ (setq xlow (math-read-number X+ (substring xval X+ (match-beginning 1) X+ (match-end 1))) X+ xhigh (math-read-number X+ (substring xval b2 e2)))) X+ (if xlow X+ (while (and (cdr ycacheptr) X+ (math-lessp (car (nth 1 ycacheptr)) X+ xlow)) X+ (setq ycacheptr (cdr ycacheptr))))) X+ (while (and (cdr ycacheptr) X+ (or (not xhigh) X+ (math-lessp (car (car ycacheptr)) X+ xhigh))) X+ (setq var-DUMMY (math-div X+ (math-add (car (car ycacheptr)) X+ (car (nth 1 ycacheptr))) X+ 2) X+ yval (math-evaluate-expr yvalue)) X+ (setcdr ycacheptr (cons (cons var-DUMMY yval) X+ (cdr ycacheptr))) X+ (setq ycacheptr (cdr (cdr ycacheptr)))) X+ (setq yp ycache X+ numsteps 1000000)) X+ (setq ycacheptr ycache) X+ (if xvec X+ (setq numsteps (1- (length xvalue)) X+ yvector nil) X+ (if (eq (car-safe xvalue) 'intv) X+ (setq numsteps resolution X+ yp nil X+ xlow (nth 2 xvalue) X+ xhigh (nth 3 xvalue) X+ xstep (math-div (math-sub xhigh xlow) X+ (1- numsteps)) X+ xvalue (nth 2 xvalue)) X+ (error "%s is not a suitable basis for %s" X+ xname yname))) X+ (while (>= (setq numsteps (1- numsteps)) 0) X+ (if xvec X+ (progn X+ (setq xp (cdr xp) X+ xval (car xp)) X+ (and (consp (car ycacheptr)) X+ (not (math-lessp (car (car ycacheptr)) xval)) X+ (setq ycacheptr ycache))) X+ (if (= numsteps 0) X+ (setq xval xhigh) ; avoid cumulative roundoff X+ (setq xval xvalue X+ xvalue (math-add xvalue xstep)))) X+ (while (and (cdr ycacheptr) X+ (math-lessp (car (nth 1 ycacheptr)) xval)) X+ (setq ycacheptr (cdr ycacheptr))) X+ (or (and (cdr ycacheptr) X+ (math-equal (car (nth 1 ycacheptr)) xval)) X+ (progn X+ (setq var-DUMMY xval) X+ (setcdr ycacheptr (cons (cons xval X+ (math-evaluate-expr X+ yvalue)) X+ (cdr ycacheptr))))) X+ (setq ycacheptr (cdr ycacheptr)) X+ (if xvec X+ (setq yvector (cons (cdr (car ycacheptr)) yvector)) X+ (or yp (setq yp ycacheptr)))) X+ (if xvec X+ (setq xp xvalue X+ yvec t X+ yp (cons 'vec (nreverse yvector)) X+ numsteps (1- (length xp))) X+ (setq numsteps 1000000)))) X+ (set-buffer tempbuf) X+ (goto-char (point-max)) X+ (insert "\n" xname ":" yname "\n\n") X+ (setq tempbuftop (point)) X+ (let ((calc-group-digits nil) X+ (calc-leading-zeros nil) X+ (calc-number-radix 10)) X+ (while (<= (setq stepcount (1+ stepcount)) numsteps) X+ (if xvec X+ (setq xp (cdr xp) X+ xval (car xp) X+ yp (cdr yp) X+ yval (car yp)) X+ (if yvec X+ (setq xval xvalue X+ xvalue (math-add xvalue xstep) X+ yp (cdr yp) X+ yval (car yp)) X+ (setq xval (car (car yp)) X+ yval (cdr (car yp)) X+ yp (cdr yp)) X+ (if (or (not yp) X+ (and xhigh (equal xval xhigh))) X+ (setq numsteps 0)))) X+ (if (and (eq (car-safe yval) 'calcFunc-xy) X+ (= (length yval) 3)) X+ (setq xval (nth 1 yval) X+ yval (nth 2 yval))) X+ (if (and (Math-realp xval) X+ (Math-realp yval)) X+ (progn X+ (setq blank nil X+ non-blank t) X+ (if (Math-integerp xval) X+ (insert (math-format-number xval)) X+ (if (eq (car xval) 'frac) X+ (setq xval (math-float xval))) X+ (insert (math-format-number (nth 1 xval)) X+ "e" (int-to-string (nth 2 xval)))) X+ (insert " ") X+ (if (Math-integerp yval) X+ (insert (math-format-number yval)) X+ (if (eq (car yval) 'frac) X+ (setq yval (math-float yval))) X+ (insert (math-format-number (nth 1 yval)) X+ "e" (int-to-string (nth 2 yval)))) X+ (insert "\n")) X+ (and (boundp 'var-PlotRejects) X+ (eq (car-safe var-PlotRejects) 'vec) X+ (nconc var-PlotRejects (list (list 'vec X+ curve-num X+ stepcount X+ xval yval)))) X+ (or blank X+ (progn X+ (insert "\n") X+ (setq blank t)))))) X+ (or non-blank X+ (error "No valid data points for %s:%s" xname yname)) X+ (setq tempfiles (cons filename tempfiles)) X+ (write-region tempbuftop (point-max) filename nil 'quiet)))) X+ (insert (prin1-to-string filename)))) X+ (if (= curve-num 0) X+ (progn X+ (calc-gnuplot-command "clear") X+ (message "No data to plot!")) X+ (setq calc-graph-data-cache-limit (max curve-num X+ calc-graph-data-cache-limit) X+ filename (make-temp-name calc-gnuplot-tempfile) X+ tempfiles (cons filename tempfiles)) X+ (write-region (point-min) (point-max) filename nil 'quiet) X+ (calc-gnuplot-command "load" (prin1-to-string filename)) X+ (let ((command (if printing X+ calc-gnuplot-print-command X+ calc-gnuplot-plot-command))) X+ (if command X+ (if (stringp command) X+ (calc-gnuplot-command X+ "!" (format command X+ (or tempoutfile X+ calc-gnuplot-print-output))) X+ (eval command)))) X+ (calc-gnuplot-command "! rm" (mapconcat 'identity tempfiles " ")))))) X+ ) X+ X+ (defun calc-graph-clear () X+ "Clear the graphics display. In X11, remove the graphics window." X+ (interactive) X+ (if (or (equal calc-graph-last-device "x11") X+ (equal calc-graph-last-device "X11")) X+ (calc-gnuplot-command "set output" X+ (prin1-to-string calc-graph-last-output)) X+ (calc-gnuplot-command "clear")) X+ ) X+ X+ (defun calc-graph-title-x (title) X+ "Specify the title for the x-axis of the graph." X+ (interactive "sX axis title: ") X+ (calc-graph-set-command "xlabel" (if (not (equal title "")) X+ (prin1-to-string title))) X+ ) X+ X+ (defun calc-graph-title-y (title) X+ "Specify the title for the y-axis of the graph." X+ (interactive "sY axis title: ") X+ (calc-graph-set-command "ylabel" (if (not (equal title "")) X+ (prin1-to-string title))) X+ ) X+ X+ (defun calc-graph-range-x (range) X+ "Enter the range of values on the x-axis of the graph: \"min:max\". X+ Enter a blank line for auto-scaling of the x-axis. X+ Enter \"$\" to pull the range from top-of-stack as an interval or 2-vector." X+ (interactive "sX axis range: ") X+ (calc-graph-set-range "xrange" range) X+ ) X+ X+ (defun calc-graph-range-y (range) X+ "Enter the range of values on the y-axis of the graph: \"min:max\". X+ Enter a blank line for auto-scaling of the y-axis. X+ Enter \"$\" to pull the range from top-of-stack as an interval or 2-vector." X+ (interactive "sY axis range: ") X+ (calc-graph-set-range "yrange" range) X+ ) X+ X+ (defun calc-graph-set-range (cmd range) X+ (if (equal range "$") X+ (calc-wrapper X+ (let ((val (calc-top-n 1))) X+ (if (eq (car-safe val) 'intv) X+ (setq range (concat X+ (math-format-number (math-float (nth 2 val))) ":" X+ (math-format-number (math-float (nth 3 val))))) X+ (if (and (eq (car-safe val) 'vec) X+ (= (length val) 3)) X+ (setq range (concat X+ (math-format-number (math-float (nth 1 val))) ":" X+ (math-format-number (math-float (nth 2 val))))) X+ (error "Range specification must be an interval or 2-vector"))) X+ (calc-pop-stack 1)))) X+ (if (string-match "\\[.+\\]" range) X+ (setq range (substring range 1 -1))) X+ (if (and (not (string-match ":" range)) X+ (or (string-match "," range) X+ (string-match " " range))) X+ (aset range (match-beginning 0) ?\:)) X+ (calc-graph-set-command cmd (if (not (equal range "")) X+ (concat "[" range "]"))) X+ ) X+ X+ (defun calc-graph-log-x (flag) X+ "Toggle whether the x-axis uses a logarithmic scale. X+ With a numeric prefix argument, turn it on if positive, off if negative." X+ (interactive "P") X+ (calc-graph-set-log flag 0) X+ ) X+ X+ (defun calc-graph-log-y (flag) X+ "Toggle whether the y-axis uses a logarithmic scale. X+ With a numeric prefix argument, turn it on if positive, off if negative." X+ (interactive "P") X+ (calc-graph-set-log 0 flag) X+ ) X+ X+ (defun calc-graph-set-log (xflag yflag) X+ (let* ((old (or (calc-graph-find-command "logscale") "")) X+ (xold (string-match "x" old)) X+ (yold (string-match "y" old)) X+ str) X+ (setq str (concat (if (if xflag X+ (if (eq xflag 0) xold X+ (> (prefix-numeric-value xflag))) X+ (not xold)) "x" "") X+ (if (if yflag X+ (if (eq yflag 0) yold X+ (> (prefix-numeric-value yflag))) X+ (not yold)) "y" ""))) X+ (calc-graph-set-command "logscale" (if (not (equal str "")) str))) X+ ) X+ X+ (defun calc-graph-line-style (style) X+ "Toggle lines connecting data points, or set line style. X+ This applies to the most recently added curve in the graph. X+ Normally, turn lines on or off without affecting current style. X+ With a numeric prefix argument, turn lines on and set the style number." X+ (interactive "P") X+ (calc-graph-set-styles style t) X+ ) X+ X+ (defun calc-graph-point-style (style) X+ "Toggle points on the data points, or set point style. X+ This applies to the most recently added curve in the graph. X+ Normally, turn points on or off without affecting current style. X+ With a numeric prefix argument, turn points on and set the style number." X+ (interactive "P") X+ (calc-graph-set-styles t style) X+ ) X+ X+ (defun calc-graph-set-styles (lines points) X+ (calc-graph-init) X+ (save-excursion X+ (set-buffer calc-gnuplot-input) X+ (or (calc-graph-find-plot nil nil) X+ (error "No data points have been set!")) X+ (let ((base (point)) X+ (mode nil) (lstyle nil) (pstyle nil) X+ start end lenbl penbl) X+ (re-search-forward "[,\n]") X+ (forward-char -1) X+ (setq end (point) start end) X+ (goto-char base) X+ (if (looking-at "[^,\n]*[^,\n \t]\\([ \t]+with\\)") X+ (progn X+ (setq start (match-beginning 1)) X+ (goto-char (match-end 0)) X+ (if (looking-at "[ \t]+\\([a-z]+\\)") X+ (setq mode (buffer-substring (match-beginning 1) X+ (match-end 1)))) X+ (if (looking-at "[ \ta-z]+\\([0-9]+\\)") X+ (setq lstyle (string-to-int X+ (buffer-substring (match-beginning 1) X+ (match-end 1))))) X+ (if (looking-at "[ \ta-z]+[0-9]+[ \t]+\\([0-9]+\\)") X+ (setq pstyle (string-to-int X+ (buffer-substring (match-beginning 1) X+ (match-end 1))))))) X+ (setq lenbl (or (equal mode "lines") (equal mode "linespoints")) X+ penbl (or (equal mode "points") (equal mode "linespoints"))) X+ (if lines X+ (or (eq lines t) X+ (setq lstyle lines X+ lenbl t)) X+ (setq lenbl (not lenbl))) X+ (if points X+ (or (eq points t) X+ (setq pstyle points X+ penbl t)) X+ (setq penbl (not penbl))) X+ (delete-region start end) X+ (goto-char start) X+ (insert " with " X+ (if lenbl X+ (if penbl "linespoints" "lines") X+ (if penbl "points" "dots"))) X+ (if (and pstyle (> pstyle 0)) X+ (insert " " (if (and lstyle (> lstyle 0)) (int-to-string lstyle) "1") X+ " " (int-to-string pstyle)) X+ (if (and lstyle (> lstyle 0)) X+ (insert " " (int-to-string lstyle)))))) X+ (calc-graph-view-commands) X+ ) X+ X+ (defun calc-graph-name (name) X+ "Specify the title for the most recently added curve in the graph." X+ (interactive "sTitle for current curve: ") X+ (calc-graph-init) X+ (save-excursion X+ (set-buffer calc-gnuplot-input) X+ (or (calc-graph-find-plot nil nil) X+ (error "No data points have been set!")) X+ (let ((base (point)) X+ start) X+ (re-search-forward "[,\n]\\|[ \t]+with") X+ (setq end (match-beginning 0)) X+ (goto-char base) X+ (if (looking-at "[^,\n]*[^,\n \t]\\([ \t]+title\\)") X+ (progn X+ (goto-char (match-beginning 1)) X+ (delete-region (point) end)) X+ (goto-char end)) X+ (insert " title " (prin1-to-string name)))) X+ (calc-graph-view-commands) X+ ) X+ X+ (defun calc-graph-hide (flag) X+ "Hide or unhide the most recently added curve in the graph." X+ (interactive "P") X+ (calc-graph-init) X+ (and (calc-graph-find-plot nil nil) X+ (progn X+ (or (looking-at "{") X+ (error "Can't hide this curve (wrong format)")) X+ (forward-char 1) X+ (if (looking-at "*") X+ (if (or (null flag) (<= (prefix-numeric-value flag) 0)) X+ (delete-char 1)) X+ (if (or (null flag) (> (prefix-numeric-value flag) 0)) X+ (insert "*"))))) X+ ) X+ X+ (defun calc-graph-header (title) X+ "Specify the title for the entire graph." X+ (interactive "sTitle for entire graph: ") X+ (calc-graph-set-command "title" (if (not (equal title "")) X+ (prin1-to-string title))) X+ ) X+ X+ (defun calc-graph-grid (flag) X+ "Toggle the grid (as opposed to plain tick marks) on and off. X+ With a numeric prefix argument, turn it on if positive, off if negative." X+ (interactive "P") X+ (calc-graph-set-command "grid" (and (if flag X+ (> (prefix-numeric-value flag) 0) X+ (not (calc-graph-find-command "grid"))) X+ " ")) X+ ) X+ X+ (defun calc-graph-key (flag) X+ "Toggle the key (legend of curves vs. line styles) on and off. X+ With a numeric prefix argument, turn it on if positive, off if negative." X+ (interactive "P") X+ (calc-graph-set-command "key" (and (if flag X+ (> (prefix-numeric-value flag) 0) X+ (not (calc-graph-find-command "key"))) X+ " ")) X+ ) X+ X+ (defun calc-graph-num-points (res flag) X+ "Specify the number of data points to use when plotting functions. X+ If you enter a blank line, the resolution reverts to the default. X+ X+ With a numeric prefix argument, set the default number of data points. X+ In this case, a blank entry displays the current setting." X+ (interactive "sNumber of data points: \nP") X+ (if flag X+ (if (equal res "") X+ (message "Default resolution is %d." calc-graph-default-resolution) X+ (setq calc-graph-default-resolution (string-to-int res))) X+ (calc-graph-set-command "samples" (if (not (equal res "")) res))) X+ ) X+ X+ (defun calc-graph-device (name flag) X+ "Set the GNUPLOT device name to use for this plot. X+ If you enter a blank line, the device name reverts to the default. X+ If you enter \"?\", you are given a list of possible device names. X+ X+ With a positive numeric prefix, you set the default device name. X+ With a negative numeric prefix, you set the printer device name. X+ In these cases, a blank entry displays the current setting. X+ X+ The default device may be \"default\"; this will use \"x11\" if the X+ X window system is available, else \"postscript\"." X+ (interactive "sDevice name: \nP") X+ (if (equal name "?") X+ (progn X+ (calc-gnuplot-command "set terminal") X+ (calc-graph-view-trail)) X+ (if flag X+ (if (> (prefix-numeric-value flag) 0) X+ (if (equal name "") X+ (message "Default GNUPLOT device is \"%s\"." X+ calc-gnuplot-default-device) X+ (setq calc-gnuplot-default-device name)) X+ (if (equal name "") X+ (message "GNUPLOT device for Print command is \"%s\"." X+ calc-gnuplot-print-device) X+ (setq calc-gnuplot-print-device name))) X+ (calc-graph-set-command "terminal" (if (not (equal name "")) X+ name)))) X+ ) X+ X+ (defun calc-graph-output (name flag) X+ "Set the GNUPLOT output file name to use for this plot. X+ If you enter a blank line, the output file name reverts to the default. X+ X+ With a positive numeric prefix, you set the default output file name. X+ With a negative numeric prefix, you set the printer output file name. X+ In these cases, a blank entry displays the current setting. X+ X+ The default and/oor printer file may be \"auto\"; this will generate a random X+ file name on the fly for each calc-graph-plot or calc-graph-print command." X+ (interactive "sOutput file name: \nP") X+ (if flag X+ (if (> (prefix-numeric-value flag) 0) X+ (if (equal name "") X+ (message "Default GNUPLOT output file is \"%s\"." X+ calc-gnuplot-default-output) X+ (setq calc-gnuplot-default-output name)) X+ (if (equal name "") X+ (message "GNUPLOT output file for Print command is \"%s\"." X+ calc-gnuplot-print-output) X+ (setq calc-gnuplot-print-output name))) X+ (calc-graph-set-command "output" (if (not (equal name "")) X+ (prin1-to-string name)))) X+ ) X+ X+ (defun calc-graph-display (name) X+ "Set the X display to be used with GNUPLOT. X+ Enter a blank line to see the current display name. X+ This has no effect unless the X window system is being used." X+ (interactive "sX display name: ") X+ (if (equal name "") X+ (message "Current X display is \"%s\"." X+ (or calc-gnuplot-display "<none>")) X+ (setq calc-gnuplot-display name) X+ (if (calc-gnuplot-alive) X+ (calc-gnuplot-command "exit"))) X+ ) X+ X+ (defun calc-graph-geometry (name) X+ "Set the X geometry specification to be used with GNUPLOT. X+ Enter a blank line to see the current geometry specification. X+ This has no effect unless the X window system is being used." X+ (interactive "sX geometry spec (or \"default\"): ") X+ (if (equal name "") X+ (message "Current X geometry is \"%s\"." X+ (or calc-gnuplot-geometry "default")) X+ (setq calc-gnuplot-geometry (and (not (equal name "default")) name)) X+ (if (calc-gnuplot-alive) X+ (calc-gnuplot-command "exit"))) X+ ) X+ X+ (defun calc-graph-find-command (cmd) X+ (calc-graph-init) X+ (save-excursion X+ (set-buffer calc-gnuplot-input) X+ (goto-char (point-min)) X+ (if (re-search-forward (concat "^set[ \t]+" cmd "[ \t]*\\(.*\\)$") nil t) X+ (buffer-substring (match-beginning 1) (match-end 1)))) X+ ) X+ X+ (defun calc-graph-set-command (cmd &rest args) X+ (calc-graph-init) X+ (save-excursion X+ (set-buffer calc-gnuplot-input) X+ (goto-char (point-min)) X+ (if (re-search-forward (concat "^set[ \t]+" cmd "[ \t\n]") nil t) X+ (progn X+ (forward-char -1) X+ (end-of-line) X+ (let ((end (point))) X+ (beginning-of-line) X+ (delete-region (point) (1+ end)))) X+ (if (calc-graph-find-plot t t) X+ (if (eq (preceding-char) ?\n) X+ (forward-char -1)) X+ (goto-char (1- (point-max))))) X+ (if (and args (car args)) X+ (progn X+ (or (bolp) X+ (insert "\n")) X+ (insert "set " (mapconcat 'identity (cons cmd args) " ") "\n")))) X+ (calc-graph-view-commands) X+ ) X+ X+ (defun calc-graph-command (cmd) X+ "Send an arbitrary command to the current GNUPLOT process." X+ (interactive "sGNUPLOT command: ") X+ (calc-wrapper X+ (calc-graph-init) X+ (calc-graph-view-trail) X+ (calc-gnuplot-command cmd) X+ (accept-process-output) X+ (calc-graph-view-trail)) X+ ) X+ X+ (defun calc-graph-kill () X+ "Kill the current GNUPLOT process." X+ (interactive) X+ (if (calc-gnuplot-alive) X+ (calc-wrapper X+ (calc-graph-view-trail) X+ (let ((calc-graph-no-wait t)) X+ (calc-gnuplot-command "exit")) X+ (sit-for 1) X+ (if (process-status calc-gnuplot-process) X+ (delete-process calc-gnuplot-process)) X+ (setq calc-gnuplot-process nil))) X+ ) X+ X+ (defun calc-graph-view-commands (&optional no-need) X+ "Display the current GNUPLOT input commands in another window." X+ (interactive "p") X+ (or calc-graph-no-auto-view (calc-graph-init-buffers)) X+ (calc-graph-view calc-gnuplot-input calc-gnuplot-buffer (null no-need)) X+ ) X+ X+ (defun calc-graph-view-trail (&optional no-need) X+ "Display the GNUPLOT session transcript in another window." X+ (interactive "p") X+ (or calc-graph-no-auto-view (calc-graph-init-buffers)) X+ (calc-graph-view calc-gnuplot-buffer calc-gnuplot-input (null no-need)) X+ ) X+ X+ (defun calc-graph-view (buf other-buf need) X+ (let (win) X+ (or calc-graph-no-auto-view X+ (if (setq win (get-buffer-window buf)) X+ (or need X+ (and (eq buf calc-gnuplot-buffer) X+ (save-excursion X+ (set-buffer buf) X+ (not (pos-visible-in-window-p (point-max) win)))) X+ (progn X+ (bury-buffer buf) X+ (bury-buffer other-buf) X+ (let ((curwin (selected-window))) X+ (select-window win) X+ (switch-to-buffer nil) X+ (select-window curwin)))) X+ (if (setq win (get-buffer-window other-buf)) X+ (set-window-buffer win buf) X+ (if (eq major-mode 'calc-mode) X+ (if (or need X+ (< (window-height) (1- (screen-height)))) X+ (display-buffer buf)) X+ (switch-to-buffer buf))))) X+ (save-excursion X+ (set-buffer buf) X+ (if (and (eq buf calc-gnuplot-buffer) X+ (setq win (get-buffer-window buf)) X+ (not (pos-visible-in-window-p (point-max) win))) X+ (progn X+ (goto-char (point-max)) X+ (vertical-motion (- 6 (window-height win))) X+ (set-window-start win (point)) X+ (goto-char (point-max))))) X+ (or calc-graph-no-auto-view (sit-for 0))) X+ ) X+ (setq calc-graph-no-auto-view nil) X+ X+ (defun calc-gnuplot-check-for-errors () X+ (if (save-excursion X+ (prog2 X+ (progn X+ (set-buffer calc-gnuplot-buffer) X+ (goto-char calc-gnuplot-last-error-pos)) X+ (re-search-forward "^[ \t]" nil t) X+ (goto-char (point-max)) X+ (setq calc-gnuplot-last-error-pos (point-max)))) X+ (calc-graph-view-trail)) X+ ) X+ X+ (defun calc-gnuplot-command (&rest args) X+ (calc-graph-init) X+ (let ((cmd (concat (mapconcat 'identity args " ") "\n"))) X+ (accept-process-output) X+ (save-excursion X+ (set-buffer calc-gnuplot-buffer) X+ (calc-gnuplot-check-for-errors) X+ (goto-char (point-max)) X+ (insert cmd) X+ (set-marker (process-mark calc-gnuplot-process) (point)) X+ (process-send-string calc-gnuplot-process cmd) X+ (if (get-buffer-window calc-gnuplot-buffer) X+ (calc-graph-view-trail)) X+ (accept-process-output (and (not calc-graph-no-wait) X+ calc-gnuplot-process)) X+ (calc-gnuplot-check-for-errors) X+ (if (get-buffer-window calc-gnuplot-buffer) X+ (calc-graph-view-trail)))) X+ ) X+ (setq calc-graph-no-wait nil) X+ X+ (defun calc-graph-init-buffers () X+ (or (and calc-gnuplot-buffer X+ (buffer-name calc-gnuplot-buffer)) X+ (setq calc-gnuplot-buffer (get-buffer-create "*Gnuplot Trail*"))) X+ (or (and calc-gnuplot-input X+ (buffer-name calc-gnuplot-input)) X+ (setq calc-gnuplot-input (get-buffer-create "*Gnuplot Commands*"))) X+ ) X+ X+ (defun calc-graph-init () X+ (or (calc-gnuplot-alive) X+ (progn X+ (if calc-gnuplot-process X+ (progn X+ (delete-process calc-gnuplot-process) X+ (setq calc-gnuplot-process nil))) X+ (calc-graph-init-buffers) X+ (save-excursion X+ (set-buffer calc-gnuplot-buffer) X+ (insert "\nStarting gnuplot...\n")) X+ (setq calc-graph-last-device nil) X+ (setq calc-graph-last-output nil) X+ (condition-case err X+ (let ((args (append (and calc-gnuplot-display X+ (not (equal calc-gnuplot-display X+ (getenv "DISPLAY"))) X+ (list "-display" X+ calc-gnuplot-display)) X+ (and calc-gnuplot-geometry X+ (list "-geometry" X+ calc-gnuplot-geometry))))) X+ (setq calc-gnuplot-process X+ (apply 'start-process X+ "gnuplot" X+ calc-gnuplot-buffer X+ calc-gnuplot-name X+ args)) X+ (process-kill-without-query calc-gnuplot-process)) X+ (file-error X+ (error "Sorry, can't find \"%s\" on your system." X+ calc-gnuplot-name))))) X+ (save-excursion X+ (set-buffer calc-gnuplot-input) X+ (if (= (buffer-size) 0) X+ (insert "# Commands for running gnuplot\n\n\n") X+ (or calc-graph-no-auto-view X+ (eq (char-after (1- (point-max))) ?\n) X+ (progn X+ (goto-char (point-max)) X+ (insert "\n"))))) X+ ) X+ X+ ;;;; [calc-ext.el] X+ X+ (defun calc-gnuplot-alive () X+ (and calc-gnuplot-process X+ calc-gnuplot-buffer X+ (buffer-name calc-gnuplot-buffer) X+ calc-gnuplot-input X+ (buffer-name calc-gnuplot-input) X+ (memq (process-status calc-gnuplot-process) '(run stop))) X+ ) X+ X+ X+ X+ X+ X ;;; Combinatorics X X (defun calc-k-prefix-help () X (interactive) X (calc-do-prefix-help X! '("GCD, LCM; Choose (binomial), Double-factorial" X! "Random, random-Again, sHuffle" X "Factors, Prime-test, Next-prime, Totient, Moebius" X! "Bernoulli, Euler, Stirling" X! "SHIFT + Extended-gcd" X! "SHIFT + dists: Binomial, Chi-square, F, Normal" X! "SHIFT + dists: Poisson, student's-T") X "combinatorics" ?k) X ) X X*************** X*** 3197,3212 **** X "Produce a random integer between 0 (inclusive) and N (exclusive). X N is the numeric prefix argument, if any, otherwise it is taken from the stack. X If N is real, produce a random real number in the specified range. X! If N is zero, produce a Gaussian-distributed value with mean 0, variance 1." X (interactive "P") X (calc-slow-wrapper X (if n X (calc-enter-result 0 "rand" (list 'calcFunc-random X! (setq calc-last-random-limit X! (prefix-numeric-value n)))) X (calc-enter-result 1 "rand" (list 'calcFunc-random X! (setq calc-last-random-limit X! (calc-top-n 1)))))) X ) X X (defun calc-rrandom () X--- 6634,6659 ---- X "Produce a random integer between 0 (inclusive) and N (exclusive). X N is the numeric prefix argument, if any, otherwise it is taken from the stack. X If N is real, produce a random real number in the specified range. X! If N is 0.0, produce a Gaussian-distributed value with mean 0, std dev 1. X! If N is M +/- S, produce a Gaussian-distributed value with mean M, std dev S. X! If N is an interval form, produce a random number in the interval. X! If N is a vector, pick an element of the vector at random. X! If N is the integer 0, reuse the previous value of N." X (interactive "P") X (calc-slow-wrapper X (if n X (calc-enter-result 0 "rand" (list 'calcFunc-random X! (calc-get-random-limit X! (prefix-numeric-value n)))) X (calc-enter-result 1 "rand" (list 'calcFunc-random X! (calc-get-random-limit X! (calc-top-n 1)))))) X! ) X! X! (defun calc-get-random-limit (val) X! (if (eq val 0) X! calc-last-random-limit X! (setq calc-last-random-limit val)) X ) X X (defun calc-rrandom () X*************** X*** 3217,3229 **** X (calc-enter-result 0 "rand" (list 'calcFunc-random '(float 1 0)))) X ) X X! (defun calc-random-again () X "Produce another random number in the same range as the last one generated." X! (interactive) X (calc-slow-wrapper X! (calc-enter-result 0 "rand" (list 'calcFunc-random calc-last-random-limit))) X ) X X (defun calc-report-prime-test (res) X (cond ((eq (car res) t) X (calc-record-message "prim" "Prime (guaranteed)")) X--- 6664,6694 ---- X (calc-enter-result 0 "rand" (list 'calcFunc-random '(float 1 0)))) X ) X X! (defun calc-random-again (arg) X "Produce another random number in the same range as the last one generated." X! (interactive "p") X (calc-slow-wrapper X! (while (>= (setq arg (1- arg)) 0) X! (calc-enter-result 0 "rand" (list 'calcFunc-random X! calc-last-random-limit)))) X ) X X+ (defun calc-shuffle (n) X+ "Produce a random selection of N items from the set M without duplicates. X+ M may take any of the argument formats supported by calc-random." X+ (interactive "P") X+ (calc-slow-wrapper X+ (if n X+ (calc-enter-result 1 "shuf" (list 'calcFunc-shuffle X+ (prefix-numeric-value n) X+ (calc-get-random-limit X+ (calc-top-n 1)))) X+ (calc-enter-result 2 "shuf" (list 'calcFunc-shuffle X+ (calc-top-n 1) X+ (calc-get-random-limit X+ (calc-top-n 2)))))) X+ ) X+ X (defun calc-report-prime-test (res) X (cond ((eq (car res) t) X (calc-record-message "prim" "Prime (guaranteed)")) X*************** X*** 3321,3327 **** X (interactive) X (calc-do-prefix-help X '("Deg, Rad, HMS; Frac; Polar; Algebraic; Symbolic" X! "Working; Xtensions; M=save" X "SHIFT + simplify: Off, Num, Default, Bin-clip, Alg, Units") X "mode" ?m) X ) X--- 6786,6793 ---- X (interactive) X (calc-do-prefix-help X '("Deg, Rad, HMS; Frac; Polar; Algebraic; Symbolic" X! "Working; Xtensions; Mode-save" X! "SHIFT + Shifted-prefixes" X "SHIFT + simplify: Off, Num, Default, Bin-clip, Alg, Units") X "mode" ?m) X ) X*************** X*** 3371,3382 **** X (save-buffer))) X ) X X! (defun calc-algebraic-mode () X "Turn Algebraic mode on or off. X! In algebraic mode, numeric entry accepts whole expressions without needing \"'\"." X! (interactive) X (calc-wrapper X! (setq calc-algebraic-mode (not calc-algebraic-mode))) X ) X X (defun calc-symbolic-mode () X--- 6837,6869 ---- X (save-buffer))) X ) X X! (defun calc-shift-prefix () X! "Turn shifted prefixes mode on or off. X! In this mode, the prefix keys A, B, D, F, G, J, K, and M can be used shifted X! as well as unshifted. The commands that are normally bound to those X! shifted letters, e.g., D for reDo, now use doubled keystrokes: DD = reDo. X! Note that V always has this property, and C, T, U, and Z never do." X! (interactive) X! (calc-wrapper X! (setq calc-shift-prefix (not calc-shift-prefix)) X! (calc-init-prefixes) X! (message (if calc-shift-prefix X! "Prefix keys A, B, D, F, G, J, K, M, V are now case-insensitive" X! "Prefix keys must be unshifted (except V, Z)"))) X! ) X! X! (defun calc-algebraic-mode (flag) X "Turn Algebraic mode on or off. X! In algebraic mode, numeric entry accepts whole expressions without needing \"'\". X! With a numeric prefix argument, sets algebraic mode for [ and ( keys only." X! (interactive "P") X (calc-wrapper X! (if flag X! (setq calc-incomplete-algebraic-mode X! (not calc-incomplete-algebraic-mode) X! calc-algebraic-mode nil) X! (setq calc-incomplete-algebraic-mode nil X! calc-algebraic-mode (not calc-algebraic-mode)))) X ) X X (defun calc-symbolic-mode () X*************** X*** 3549,3555 **** X (interactive) X (calc-do-prefix-help X '("Display; Fwd, Back; Next, Prev, Here, [, ]; Yank" X! "Search, Reverse; In, Out; <, >; Kill; Marker") X "trail" ?t) X ) X X--- 7036,7042 ---- X (interactive) X (calc-do-prefix-help X '("Display; Fwd, Back; Next, Prev, Here, [, ]; Yank" X! "Search, Reverse; In, Out; <, >; Kill; Marker; . (abbrev)") X "trail" ?t) X ) X X*************** X*** 3568,3574 **** X (calc-select-buffer) X (let ((win (get-buffer-window (current-buffer)))) X (if win X! (select-window win) X (calc))) X ) X X--- 7055,7063 ---- X (calc-select-buffer) X (let ((win (get-buffer-window (current-buffer)))) X (if win X! (progn X! (select-window win) X! (calc-align-stack-window)) X (calc))) X ) X X*************** X*** 3663,3669 **** X (calc-with-trail-buffer X (save-window-excursion X (select-window (get-buffer-window (current-buffer))) X! (isearch t nil)) X (calc-trail-here)) X ) X X--- 7152,7159 ---- X (calc-with-trail-buffer X (save-window-excursion X (select-window (get-buffer-window (current-buffer))) X! (let ((search-exit-char ?\r)) X! (isearch t nil))) X (calc-trail-here)) X ) X X*************** X*** 3673,3679 **** X (calc-with-trail-buffer X (save-window-excursion X (select-window (get-buffer-window (current-buffer))) X! (isearch nil nil)) X (calc-trail-here)) X ) X X--- 7163,7170 ---- X (calc-with-trail-buffer X (save-window-excursion X (select-window (get-buffer-window (current-buffer))) X! (let ((search-exit-char ?\r)) X! (isearch nil nil))) X (calc-trail-here)) X ) X X*************** X*** 3689,3701 **** X (looking-at " ? ? ?[^ \n]* *$") X (looking-at "..?.?$")) X (error "Can't yank that line")) X (forward-char 4) X (search-forward " ") X (let* ((next (save-excursion (forward-line 1) (point))) X (str (buffer-substring (point) (1- next))) X! (calc-language nil) X! (math-expr-opers math-standard-opers) X! (val (math-read-expr str))) X (if (eq (car-safe val) 'error) X (error "Can't yank that line: " (nth 2 val)) X val))))) X--- 7180,7192 ---- X (looking-at " ? ? ?[^ \n]* *$") X (looking-at "..?.?$")) X (error "Can't yank that line")) X+ (if (looking-at ".*, \\.\\.\\., ") X+ (error "Can't yank (vector was abbreviated)")) X (forward-char 4) X (search-forward " ") X (let* ((next (save-excursion (forward-line 1) (point))) X (str (buffer-substring (point) (1- next))) X! (val (math-read-plain-expr str))) X (if (eq (car-safe val) 'error) X (error "Can't yank that line: " (nth 2 val)) X val))))) X*************** X*** 3937,3946 **** X ) X X (defun calc-view-units-table (n) X! "Display a temporary buffer for displaying the Units Table." X (interactive "P") X (and n (setq math-units-table-buffer-valid nil)) X! (math-build-units-table-buffer nil) X ) X X (defun calc-enter-units-table (n) X--- 7428,7448 ---- X ) X X (defun calc-view-units-table (n) X! "Display a temporary buffer for displaying the Units Table. X! If the Units Table is already displayed in a window, hide it again." X (interactive "P") X (and n (setq math-units-table-buffer-valid nil)) X! (let ((win (get-buffer-window "*Units Table*"))) X! (if (and win X! math-units-table X! math-units-table-buffer-valid) X! (progn X! (bury-buffer (window-buffer win)) X! (let ((curwin (selected-window))) X! (select-window win) X! (switch-to-buffer nil) X! (select-window curwin))) X! (math-build-units-table-buffer nil))) X ) X X (defun calc-enter-units-table (n) X*************** X*** 4075,4085 **** X (interactive) X (calc-do-prefix-help X '("Pack, Unpack, Identity, Diagonal, indeX, Build" X! "Row, Col, Length; rNorm" X! "Tranpose, Arrange; Sort, Histogram" X! "SHIFT + Det, Inv, LUD, Trace, conJtrn, Cross, cNorm" X! "SHIFT + Reduce, Map, Apply" X! "<, =, > (justification); , (commas); [, {, ( (brackets)") X "vec/mat" ?v) X ) X X--- 7577,7589 ---- X (interactive) X (calc-do-prefix-help X '("Pack, Unpack, Identity, Diagonal, indeX, Build" X! "Row, Column, Subvector; Length; Find; Mask, Expand" X! "Tranpose, Arrange, reVerse; rNorm" X! "SHIFT + Det, & (inverse), LUD, Trace, conJtrn, Cross" X! "SHIFT + Sort, Grade, Histogram; cNorm" X! "SHIFT + Reduce, Map, Apply, Inner-prod, Outer-prod" X! "<, =, > (justification); , (commas); [, {, ( (brackets)" X! ". (abbreviate); / (multi-lines)") X "vec/mat" ?v) X ) X X*************** X*** 4088,4094 **** X Or concatenate a scalar value and a vector." X (interactive "P") X (calc-wrapper X! (calc-binary-op "|" 'calcFunc-vconcat arg '(vec))) X ) X X ;;;; [calc-mode.el] X--- 7592,7598 ---- X Or concatenate a scalar value and a vector." X (interactive "P") X (calc-wrapper X! (calc-binary-op "|" 'calcFunc-vconcat arg '(vec) nil '|)) X ) X X ;;;; [calc-mode.el] X*************** X*** 4117,4122 **** X--- 7621,7656 ---- X (calc-refresh)) X ) X X+ (defun calc-full-vectors () X+ "Turn abbreviated display of long vectors on and off." X+ (interactive) X+ (calc-wrapper X+ (setq calc-full-vectors (not calc-full-vectors)) X+ (calc-refresh) X+ (message (if calc-full-vectors X+ "Displaying long vectors in full." X+ "Displaying long vectors in [a, b, c, ..., z] notation."))) X+ ) X+ X+ (defun calc-full-trail-vectors () X+ "Turn abbreviated display of long vectors on and off in the Trail." X+ (interactive) X+ (calc-wrapper X+ (setq calc-full-trail-vectors (not calc-full-trail-vectors)) X+ (calc-refresh) X+ (message (if calc-full-trail-vectors X+ "Recording long vectors in full." X+ "Recording long vectors in [a, b, c, ..., z] notation."))) X+ ) X+ X+ (defun calc-break-vectors () X+ "Turn multi-line display of plain vectors on and off." X+ (interactive) X+ (calc-wrapper X+ (setq calc-break-vectors (not calc-break-vectors)) X+ (calc-refresh)) X+ ) X+ X (defun calc-vector-commas () X "Turn separating commas in vectors on and off." X (interactive) X*************** X*** 4250,4261 **** X (prefix-numeric-value n)))) X ) X X! (defun calc-index (n) X "Generate a vector of the form [1, 2, ..., N]." X! (interactive "NSize of vector = ") X (calc-wrapper X! (calc-enter-result 0 "indx" (list 'calcFunc-index X! (prefix-numeric-value n)))) X ) X X (defun calc-build-vector (n) X--- 7784,7797 ---- X (prefix-numeric-value n)))) X ) X X! (defun calc-index (n &optional stack) X "Generate a vector of the form [1, 2, ..., N]." X! (interactive "NSize of vector = \nP") X (calc-wrapper X! (if (consp stack) X! (calc-enter-result 3 "indx" (cons 'calcFunc-index (calc-top-list-n 3))) X! (calc-enter-result 0 "indx" (list 'calcFunc-index X! (prefix-numeric-value n))))) X ) X X (defun calc-build-vector (n) X*************** X*** 4267,4272 **** X--- 7803,7831 ---- X (prefix-numeric-value n)))) X ) X X+ (defun calc-cons (arg) X+ "Insert the object in stack level 2 at front of vector at top of stack." X+ (interactive "P") X+ (calc-wrapper X+ (calc-binary-op "cons" 'calcFunc-cons arg)) X+ ) X+ X+ X+ (defun calc-head (arg) X+ "Extract the first element of the vector on the top of the stack." X+ (interactive "P") X+ (calc-wrapper X+ (calc-unary-op "head" 'calcFunc-head arg)) X+ ) X+ X+ X+ (defun calc-tail (arg) X+ "Extract all but the first element of the vector on the top of the stack." X+ (interactive "P") X+ (calc-wrapper X+ (calc-unary-op "tail" 'calcFunc-tail arg)) X+ ) X+ X (defun calc-vlength (arg) X "Replace a vector with its length, in the form of an integer." X (interactive "P") X*************** X*** 4282,4290 **** X (prefix-numeric-value n)))) X ) X X (defun calc-sort () X "Sort the matrix at top of stack into increasing order. X! With Inverse flag or a negative numeric prefix, sort into decreasing order." X (interactive) X (calc-slow-wrapper X (if (calc-is-inverse) X--- 7841,7905 ---- X (prefix-numeric-value n)))) X ) X X+ (defun calc-vector-find (arg) X+ "Search for a given element in a vector, return index of the element." X+ (interactive "P") X+ (calc-wrapper X+ (let ((func (cons 'calcFunc-find (calc-top-list-n 2)))) X+ (calc-enter-result X+ 2 "find" X+ (if arg (append func (list (prefix-numeric-value arg))) func)))) X+ ) X+ X+ (defun calc-subvector () X+ "Extract a subvector of a vector: subvec(vec,start,end). X+ If start is zero or negative, it is interpreted as length(vec) + start + 1. X+ Same for end. If end is omitted in the algebraic form, it is taken as zero. X+ Elements from start, inclusive, to end, exclusive, are taken." X+ (interactive) X+ (calc-wrapper X+ (calc-enter-result 3 "svec" (cons 'calcFunc-subvec (calc-top-list-n 3)))) X+ ) X+ X+ (defun calc-reverse-vector (arg) X+ "Reverse the order of elements in a vector." X+ (interactive "P") X+ (calc-wrapper X+ (calc-unary-op "rev" 'calcFunc-rev arg)) X+ ) X+ X+ (defun calc-mask-vector (arg) X+ "Compress a vector according to a mask vector. X+ Vector is in top of stack, mask is in second-to-top. X+ Both input vectors must have the same size. Elements of the vector SHAR_EOF echo "End of part 6, continue with part 7" echo "7" > s2_seq_.tmp exit 0