(math-clip, math-round, math-simplify)
[bpt/emacs.git] / lisp / calc / calc-ext.el
1 ;;; calc-ext.el --- various extension functions for Calc
2
3 ;; Copyright (C) 1990, 1991, 1992, 1993, 2001, 2002, 2003, 2004,
4 ;; 2005, 2006, 2007 Free Software Foundation, Inc.
5
6 ;; Author: David Gillespie <daveg@synaptics.com>
7 ;; Maintainer: Jay Belanger <jay.p.belanger@gmail.com>
8
9 ;; This file is part of GNU Emacs.
10
11 ;; GNU Emacs is free software; you can redistribute it and/or modify
12 ;; it under the terms of the GNU General Public License as published by
13 ;; the Free Software Foundation; either version 3, or (at your option)
14 ;; any later version.
15
16 ;; GNU Emacs is distributed in the hope that it will be useful,
17 ;; but WITHOUT ANY WARRANTY; without even the implied warranty of
18 ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19 ;; GNU General Public License for more details.
20
21 ;; You should have received a copy of the GNU General Public License
22 ;; along with GNU Emacs; see the file COPYING. If not, write to the
23 ;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
24 ;; Boston, MA 02110-1301, USA.
25
26 ;;; Commentary:
27
28 ;;; Code:
29
30 (require 'calc)
31 (require 'calc-macs)
32
33 ;; Declare functions which are defined elsewhere.
34 (declare-function math-clip "calc-bin" (a &optional w))
35 (declare-function math-round "calc-arith" (a &optional prec))
36 (declare-function math-simplify "calc-alg" (top-expr))
37 (declare-function math-simplify-extended "calc-alg" (a))
38 (declare-function math-simplify-units "calc-units" (a))
39 (declare-function calc-set-language "calc-lang" (lang &optional option no-refresh))
40 (declare-function calc-flush-caches "calc-stuff" (&optional inhibit-msg))
41 (declare-function calc-save-modes "calc-mode" ())
42 (declare-function calc-embedded-modes-change "calc-embed" (vars))
43 (declare-function calc-embedded-var-change "calc-embed" (var &optional buf))
44 (declare-function math-mul-float "calc-arith" (a b))
45 (declare-function math-arctan-raw "calc-math" (x))
46 (declare-function math-sqrt-float "calc-math" (a &optional guess))
47 (declare-function math-exp-minus-1-raw "calc-math" (x))
48 (declare-function math-normalize-polar "calc-cplx" (a))
49 (declare-function math-normalize-hms "calc-forms" (a))
50 (declare-function math-normalize-mod "calc-forms" (a))
51 (declare-function math-make-sdev "calc-forms" (x sigma))
52 (declare-function math-make-intv "calc-forms" (mask lo hi))
53 (declare-function math-normalize-logical-op "calc-prog" (a))
54 (declare-function math-possible-signs "calc-arith" (a &optional origin))
55 (declare-function math-infinite-dir "calc-math" (a &optional inf))
56 (declare-function math-calcFunc-to-var "calc-map" (f))
57 (declare-function calc-embedded-evaluate-expr "calc-embed" (x))
58 (declare-function math-known-nonzerop "calc-arith" (a))
59 (declare-function math-read-expr-level "calc-aent" (exp-prec &optional exp-term))
60 (declare-function math-read-big-rec "calc-lang" (math-rb-h1 math-rb-v1 math-rb-h2 math-rb-v2))
61 (declare-function math-read-big-balance "calc-lang" (h v what &optional commas))
62 (declare-function math-format-date "calc-forms" (math-fd-date))
63 (declare-function math-vector-is-string "calccomp" (a))
64 (declare-function math-vector-to-string "calccomp" (a &optional quoted))
65 (declare-function math-format-radix-float "calc-bin" (a prec))
66 (declare-function math-compose-expr "calccomp" (a prec))
67 (declare-function math-abs "calc-arith" (a))
68 (declare-function math-format-bignum-binary "calc-bin" (a))
69 (declare-function math-format-bignum-octal "calc-bin" (a))
70 (declare-function math-format-bignum-hex "calc-bin" (a))
71 (declare-function math-format-bignum-radix "calc-bin" (a))
72 (declare-function math-compute-max-digits "calc-bin" (w r))
73
74
75 (defvar math-simplifying nil)
76 (defvar math-living-dangerously nil) ; true if unsafe simplifications are okay.
77 (defvar math-integrating nil)
78
79 (defvar math-rewrite-selections nil)
80
81 (defvar math-compose-level 0)
82 (defvar math-comp-selected nil)
83 (defvar math-comp-tagged nil)
84 (defvar math-comp-sel-hpos nil)
85 (defvar math-comp-sel-vpos nil)
86 (defvar math-comp-sel-cpos nil)
87 (defvar math-compose-hash-args nil)
88
89 (defvar calc-alg-map)
90 (defvar calc-alg-esc-map)
91
92 ;;; The following was made a function so that it could be byte-compiled.
93 (defun calc-init-extensions ()
94
95 (define-key calc-mode-map ":" 'calc-fdiv)
96 (define-key calc-mode-map "\\" 'calc-idiv)
97 (define-key calc-mode-map "|" 'calc-concat)
98 (define-key calc-mode-map "!" 'calc-factorial)
99 (define-key calc-mode-map "C" 'calc-cos)
100 (define-key calc-mode-map "E" 'calc-exp)
101 (define-key calc-mode-map "H" 'calc-hyperbolic)
102 (define-key calc-mode-map "I" 'calc-inverse)
103 (define-key calc-mode-map "J" 'calc-conj)
104 (define-key calc-mode-map "L" 'calc-ln)
105 (define-key calc-mode-map "N" 'calc-eval-num)
106 (define-key calc-mode-map "P" 'calc-pi)
107 (define-key calc-mode-map "Q" 'calc-sqrt)
108 (define-key calc-mode-map "R" 'calc-round)
109 (define-key calc-mode-map "S" 'calc-sin)
110 (define-key calc-mode-map "T" 'calc-tan)
111 (define-key calc-mode-map "U" 'calc-undo)
112 (define-key calc-mode-map "X" 'calc-call-last-kbd-macro)
113 (define-key calc-mode-map "o" 'calc-realign)
114 (define-key calc-mode-map "p" 'calc-precision)
115 (define-key calc-mode-map "w" 'calc-why)
116 (define-key calc-mode-map "x" 'calc-execute-extended-command)
117 (define-key calc-mode-map "y" 'calc-copy-to-buffer)
118
119 (define-key calc-mode-map "(" 'calc-begin-complex)
120 (define-key calc-mode-map ")" 'calc-end-complex)
121 (define-key calc-mode-map "[" 'calc-begin-vector)
122 (define-key calc-mode-map "]" 'calc-end-vector)
123 (define-key calc-mode-map "," 'calc-comma)
124 (define-key calc-mode-map ";" 'calc-semi)
125 (define-key calc-mode-map "`" 'calc-edit)
126 (define-key calc-mode-map "=" 'calc-evaluate)
127 (define-key calc-mode-map "~" 'calc-num-prefix)
128 (define-key calc-mode-map "<" 'calc-scroll-left)
129 (define-key calc-mode-map ">" 'calc-scroll-right)
130 (define-key calc-mode-map "{" 'calc-scroll-down)
131 (define-key calc-mode-map "}" 'calc-scroll-up)
132 (define-key calc-mode-map "\C-k" 'calc-kill)
133 (define-key calc-mode-map "\M-k" 'calc-copy-as-kill)
134 (define-key calc-mode-map "\C-w" 'calc-kill-region)
135 (define-key calc-mode-map "\M-w" 'calc-copy-region-as-kill)
136 (define-key calc-mode-map "\C-y" 'calc-yank)
137 (define-key calc-mode-map [mouse-2] 'calc-yank)
138 (define-key calc-mode-map "\C-_" 'calc-undo)
139 (define-key calc-mode-map "\C-xu" 'calc-undo)
140 (define-key calc-mode-map "\M-\C-m" 'calc-last-args)
141
142 (define-key calc-mode-map "a" nil)
143 (define-key calc-mode-map "a?" 'calc-a-prefix-help)
144 (define-key calc-mode-map "aa" 'calc-apart)
145 (define-key calc-mode-map "ab" 'calc-substitute)
146 (define-key calc-mode-map "ac" 'calc-collect)
147 (define-key calc-mode-map "ad" 'calc-derivative)
148 (define-key calc-mode-map "ae" 'calc-simplify-extended)
149 (define-key calc-mode-map "af" 'calc-factor)
150 (define-key calc-mode-map "ag" 'calc-poly-gcd)
151 (define-key calc-mode-map "ai" 'calc-integral)
152 (define-key calc-mode-map "am" 'calc-match)
153 (define-key calc-mode-map "an" 'calc-normalize-rat)
154 (define-key calc-mode-map "ap" 'calc-poly-interp)
155 (define-key calc-mode-map "ar" 'calc-rewrite)
156 (define-key calc-mode-map "as" 'calc-simplify)
157 (define-key calc-mode-map "at" 'calc-taylor)
158 (define-key calc-mode-map "av" 'calc-alg-evaluate)
159 (define-key calc-mode-map "ax" 'calc-expand)
160 (define-key calc-mode-map "aA" 'calc-abs)
161 (define-key calc-mode-map "aF" 'calc-curve-fit)
162 (define-key calc-mode-map "aI" 'calc-num-integral)
163 (define-key calc-mode-map "aM" 'calc-map-equation)
164 (define-key calc-mode-map "aN" 'calc-find-minimum)
165 (define-key calc-mode-map "aP" 'calc-poly-roots)
166 (define-key calc-mode-map "aS" 'calc-solve-for)
167 (define-key calc-mode-map "aR" 'calc-find-root)
168 (define-key calc-mode-map "aT" 'calc-tabulate)
169 (define-key calc-mode-map "aX" 'calc-find-maximum)
170 (define-key calc-mode-map "a+" 'calc-summation)
171 (define-key calc-mode-map "a-" 'calc-alt-summation)
172 (define-key calc-mode-map "a*" 'calc-product)
173 (define-key calc-mode-map "a\\" 'calc-poly-div)
174 (define-key calc-mode-map "a%" 'calc-poly-rem)
175 (define-key calc-mode-map "a/" 'calc-poly-div-rem)
176 (define-key calc-mode-map "a=" 'calc-equal-to)
177 (define-key calc-mode-map "a#" 'calc-not-equal-to)
178 (define-key calc-mode-map "a<" 'calc-less-than)
179 (define-key calc-mode-map "a>" 'calc-greater-than)
180 (define-key calc-mode-map "a[" 'calc-less-equal)
181 (define-key calc-mode-map "a]" 'calc-greater-equal)
182 (define-key calc-mode-map "a." 'calc-remove-equal)
183 (define-key calc-mode-map "a{" 'calc-in-set)
184 (define-key calc-mode-map "a&" 'calc-logical-and)
185 (define-key calc-mode-map "a|" 'calc-logical-or)
186 (define-key calc-mode-map "a!" 'calc-logical-not)
187 (define-key calc-mode-map "a:" 'calc-logical-if)
188 (define-key calc-mode-map "a_" 'calc-subscript)
189 (define-key calc-mode-map "a\"" 'calc-expand-formula)
190
191 (define-key calc-mode-map "b" nil)
192 (define-key calc-mode-map "b?" 'calc-b-prefix-help)
193 (define-key calc-mode-map "ba" 'calc-and)
194 (define-key calc-mode-map "bc" 'calc-clip)
195 (define-key calc-mode-map "bd" 'calc-diff)
196 (define-key calc-mode-map "bl" 'calc-lshift-binary)
197 (define-key calc-mode-map "bn" 'calc-not)
198 (define-key calc-mode-map "bo" 'calc-or)
199 (define-key calc-mode-map "bp" 'calc-pack-bits)
200 (define-key calc-mode-map "br" 'calc-rshift-binary)
201 (define-key calc-mode-map "bt" 'calc-rotate-binary)
202 (define-key calc-mode-map "bu" 'calc-unpack-bits)
203 (define-key calc-mode-map "bw" 'calc-word-size)
204 (define-key calc-mode-map "bx" 'calc-xor)
205 (define-key calc-mode-map "bB" 'calc-log)
206 (define-key calc-mode-map "bD" 'calc-fin-ddb)
207 (define-key calc-mode-map "bF" 'calc-fin-fv)
208 (define-key calc-mode-map "bI" 'calc-fin-irr)
209 (define-key calc-mode-map "bL" 'calc-lshift-arith)
210 (define-key calc-mode-map "bM" 'calc-fin-pmt)
211 (define-key calc-mode-map "bN" 'calc-fin-npv)
212 (define-key calc-mode-map "bP" 'calc-fin-pv)
213 (define-key calc-mode-map "bR" 'calc-rshift-arith)
214 (define-key calc-mode-map "bS" 'calc-fin-sln)
215 (define-key calc-mode-map "bT" 'calc-fin-rate)
216 (define-key calc-mode-map "bY" 'calc-fin-syd)
217 (define-key calc-mode-map "b#" 'calc-fin-nper)
218 (define-key calc-mode-map "b%" 'calc-percent-change)
219
220 (define-key calc-mode-map "c" nil)
221 (define-key calc-mode-map "c?" 'calc-c-prefix-help)
222 (define-key calc-mode-map "cc" 'calc-clean)
223 (define-key calc-mode-map "cd" 'calc-to-degrees)
224 (define-key calc-mode-map "cf" 'calc-float)
225 (define-key calc-mode-map "ch" 'calc-to-hms)
226 (define-key calc-mode-map "cp" 'calc-polar)
227 (define-key calc-mode-map "cr" 'calc-to-radians)
228 (define-key calc-mode-map "cC" 'calc-cos)
229 (define-key calc-mode-map "cF" 'calc-fraction)
230 (define-key calc-mode-map "c%" 'calc-convert-percent)
231
232 (define-key calc-mode-map "d" nil)
233 (define-key calc-mode-map "d?" 'calc-d-prefix-help)
234 (define-key calc-mode-map "d0" 'calc-decimal-radix)
235 (define-key calc-mode-map "d2" 'calc-binary-radix)
236 (define-key calc-mode-map "d6" 'calc-hex-radix)
237 (define-key calc-mode-map "d8" 'calc-octal-radix)
238 (define-key calc-mode-map "db" 'calc-line-breaking)
239 (define-key calc-mode-map "dc" 'calc-complex-notation)
240 (define-key calc-mode-map "dd" 'calc-date-notation)
241 (define-key calc-mode-map "de" 'calc-eng-notation)
242 (define-key calc-mode-map "df" 'calc-fix-notation)
243 (define-key calc-mode-map "dg" 'calc-group-digits)
244 (define-key calc-mode-map "dh" 'calc-hms-notation)
245 (define-key calc-mode-map "di" 'calc-i-notation)
246 (define-key calc-mode-map "dj" 'calc-j-notation)
247 (define-key calc-mode-map "dl" 'calc-line-numbering)
248 (define-key calc-mode-map "dn" 'calc-normal-notation)
249 (define-key calc-mode-map "do" 'calc-over-notation)
250 (define-key calc-mode-map "dp" 'calc-show-plain)
251 (define-key calc-mode-map "dr" 'calc-radix)
252 (define-key calc-mode-map "ds" 'calc-sci-notation)
253 (define-key calc-mode-map "dt" 'calc-truncate-stack)
254 (define-key calc-mode-map "dw" 'calc-auto-why)
255 (define-key calc-mode-map "dz" 'calc-leading-zeros)
256 (define-key calc-mode-map "dB" 'calc-big-language)
257 (define-key calc-mode-map "dD" 'calc-redo)
258 (define-key calc-mode-map "dC" 'calc-c-language)
259 (define-key calc-mode-map "dE" 'calc-eqn-language)
260 (define-key calc-mode-map "dF" 'calc-fortran-language)
261 (define-key calc-mode-map "dM" 'calc-mathematica-language)
262 (define-key calc-mode-map "dN" 'calc-normal-language)
263 (define-key calc-mode-map "dO" 'calc-flat-language)
264 (define-key calc-mode-map "dP" 'calc-pascal-language)
265 (define-key calc-mode-map "dT" 'calc-tex-language)
266 (define-key calc-mode-map "dL" 'calc-latex-language)
267 (define-key calc-mode-map "dU" 'calc-unformatted-language)
268 (define-key calc-mode-map "dW" 'calc-maple-language)
269 (define-key calc-mode-map "d[" 'calc-truncate-up)
270 (define-key calc-mode-map "d]" 'calc-truncate-down)
271 (define-key calc-mode-map "d." 'calc-point-char)
272 (define-key calc-mode-map "d," 'calc-group-char)
273 (define-key calc-mode-map "d\"" 'calc-display-strings)
274 (define-key calc-mode-map "d<" 'calc-left-justify)
275 (define-key calc-mode-map "d=" 'calc-center-justify)
276 (define-key calc-mode-map "d>" 'calc-right-justify)
277 (define-key calc-mode-map "d{" 'calc-left-label)
278 (define-key calc-mode-map "d}" 'calc-right-label)
279 (define-key calc-mode-map "d'" 'calc-display-raw)
280 (define-key calc-mode-map "d " 'calc-refresh)
281 (define-key calc-mode-map "d\r" 'calc-refresh-top)
282 (define-key calc-mode-map "d@" 'calc-toggle-banner)
283
284 (define-key calc-mode-map "f" nil)
285 (define-key calc-mode-map "f?" 'calc-f-prefix-help)
286 (define-key calc-mode-map "fb" 'calc-beta)
287 (define-key calc-mode-map "fe" 'calc-erf)
288 (define-key calc-mode-map "fg" 'calc-gamma)
289 (define-key calc-mode-map "fh" 'calc-hypot)
290 (define-key calc-mode-map "fi" 'calc-im)
291 (define-key calc-mode-map "fj" 'calc-bessel-J)
292 (define-key calc-mode-map "fn" 'calc-min)
293 (define-key calc-mode-map "fr" 'calc-re)
294 (define-key calc-mode-map "fs" 'calc-sign)
295 (define-key calc-mode-map "fx" 'calc-max)
296 (define-key calc-mode-map "fy" 'calc-bessel-Y)
297 (define-key calc-mode-map "fA" 'calc-abssqr)
298 (define-key calc-mode-map "fB" 'calc-inc-beta)
299 (define-key calc-mode-map "fE" 'calc-expm1)
300 (define-key calc-mode-map "fF" 'calc-floor)
301 (define-key calc-mode-map "fG" 'calc-inc-gamma)
302 (define-key calc-mode-map "fI" 'calc-ilog)
303 (define-key calc-mode-map "fL" 'calc-lnp1)
304 (define-key calc-mode-map "fM" 'calc-mant-part)
305 (define-key calc-mode-map "fQ" 'calc-isqrt)
306 (define-key calc-mode-map "fS" 'calc-scale-float)
307 (define-key calc-mode-map "fT" 'calc-arctan2)
308 (define-key calc-mode-map "fX" 'calc-xpon-part)
309 (define-key calc-mode-map "f[" 'calc-decrement)
310 (define-key calc-mode-map "f]" 'calc-increment)
311
312 (define-key calc-mode-map "g" nil)
313 (define-key calc-mode-map "g?" 'calc-g-prefix-help)
314 (define-key calc-mode-map "ga" 'calc-graph-add)
315 (define-key calc-mode-map "gb" 'calc-graph-border)
316 (define-key calc-mode-map "gc" 'calc-graph-clear)
317 (define-key calc-mode-map "gd" 'calc-graph-delete)
318 (define-key calc-mode-map "gf" 'calc-graph-fast)
319 (define-key calc-mode-map "gg" 'calc-graph-grid)
320 (define-key calc-mode-map "gh" 'calc-graph-header)
321 (define-key calc-mode-map "gk" 'calc-graph-key)
322 (define-key calc-mode-map "gj" 'calc-graph-juggle)
323 (define-key calc-mode-map "gl" 'calc-graph-log-x)
324 (define-key calc-mode-map "gn" 'calc-graph-name)
325 (define-key calc-mode-map "gp" 'calc-graph-plot)
326 (define-key calc-mode-map "gq" 'calc-graph-quit)
327 (define-key calc-mode-map "gr" 'calc-graph-range-x)
328 (define-key calc-mode-map "gs" 'calc-graph-line-style)
329 (define-key calc-mode-map "gt" 'calc-graph-title-x)
330 (define-key calc-mode-map "gv" 'calc-graph-view-commands)
331 (define-key calc-mode-map "gx" 'calc-graph-display)
332 (define-key calc-mode-map "gz" 'calc-graph-zero-x)
333 (define-key calc-mode-map "gA" 'calc-graph-add-3d)
334 (define-key calc-mode-map "gC" 'calc-graph-command)
335 (define-key calc-mode-map "gD" 'calc-graph-device)
336 (define-key calc-mode-map "gF" 'calc-graph-fast-3d)
337 (define-key calc-mode-map "gG" 'calc-argument)
338 (define-key calc-mode-map "gH" 'calc-graph-hide)
339 (define-key calc-mode-map "gK" 'calc-graph-kill)
340 (define-key calc-mode-map "gL" 'calc-graph-log-y)
341 (define-key calc-mode-map "gN" 'calc-graph-num-points)
342 (define-key calc-mode-map "gO" 'calc-graph-output)
343 (define-key calc-mode-map "gP" 'calc-graph-print)
344 (define-key calc-mode-map "gR" 'calc-graph-range-y)
345 (define-key calc-mode-map "gS" 'calc-graph-point-style)
346 (define-key calc-mode-map "gT" 'calc-graph-title-y)
347 (define-key calc-mode-map "gV" 'calc-graph-view-trail)
348 (define-key calc-mode-map "gX" 'calc-graph-geometry)
349 (define-key calc-mode-map "gZ" 'calc-graph-zero-y)
350 (define-key calc-mode-map "g\C-l" 'calc-graph-log-z)
351 (define-key calc-mode-map "g\C-r" 'calc-graph-range-z)
352 (define-key calc-mode-map "g\C-t" 'calc-graph-title-z)
353
354 (define-key calc-mode-map "h" 'calc-help-prefix)
355
356 (define-key calc-mode-map "j" nil)
357 (define-key calc-mode-map "j?" 'calc-j-prefix-help)
358 (define-key calc-mode-map "ja" 'calc-select-additional)
359 (define-key calc-mode-map "jb" 'calc-break-selections)
360 (define-key calc-mode-map "jc" 'calc-clear-selections)
361 (define-key calc-mode-map "jd" 'calc-show-selections)
362 (define-key calc-mode-map "je" 'calc-enable-selections)
363 (define-key calc-mode-map "jl" 'calc-select-less)
364 (define-key calc-mode-map "jm" 'calc-select-more)
365 (define-key calc-mode-map "jn" 'calc-select-next)
366 (define-key calc-mode-map "jo" 'calc-select-once)
367 (define-key calc-mode-map "jp" 'calc-select-previous)
368 (define-key calc-mode-map "jr" 'calc-rewrite-selection)
369 (define-key calc-mode-map "js" 'calc-select-here)
370 (define-key calc-mode-map "jv" 'calc-sel-evaluate)
371 (define-key calc-mode-map "ju" 'calc-unselect)
372 (define-key calc-mode-map "jC" 'calc-sel-commute)
373 (define-key calc-mode-map "jD" 'calc-sel-distribute)
374 (define-key calc-mode-map "jE" 'calc-sel-jump-equals)
375 (define-key calc-mode-map "jI" 'calc-sel-isolate)
376 (define-key calc-mode-map "jJ" 'calc-conj)
377 (define-key calc-mode-map "jL" 'calc-commute-left)
378 (define-key calc-mode-map "jM" 'calc-sel-merge)
379 (define-key calc-mode-map "jN" 'calc-sel-negate)
380 (define-key calc-mode-map "jO" 'calc-select-once-maybe)
381 (define-key calc-mode-map "jR" 'calc-commute-right)
382 (define-key calc-mode-map "jS" 'calc-select-here-maybe)
383 (define-key calc-mode-map "jU" 'calc-sel-unpack)
384 (define-key calc-mode-map "j&" 'calc-sel-invert)
385 (define-key calc-mode-map "j\r" 'calc-copy-selection)
386 (define-key calc-mode-map "j\n" 'calc-copy-selection)
387 (define-key calc-mode-map "j\010" 'calc-del-selection)
388 (define-key calc-mode-map "j\177" 'calc-del-selection)
389 (define-key calc-mode-map "j'" 'calc-enter-selection)
390 (define-key calc-mode-map "j`" 'calc-edit-selection)
391 (define-key calc-mode-map "j+" 'calc-sel-add-both-sides)
392 (define-key calc-mode-map "j-" 'calc-sel-sub-both-sides)
393 (define-key calc-mode-map "j*" 'calc-sel-mult-both-sides)
394 (define-key calc-mode-map "j/" 'calc-sel-div-both-sides)
395 (define-key calc-mode-map "j\"" 'calc-sel-expand-formula)
396
397 (define-key calc-mode-map "k" nil)
398 (define-key calc-mode-map "k?" 'calc-k-prefix-help)
399 (define-key calc-mode-map "ka" 'calc-random-again)
400 (define-key calc-mode-map "kb" 'calc-bernoulli-number)
401 (define-key calc-mode-map "kc" 'calc-choose)
402 (define-key calc-mode-map "kd" 'calc-double-factorial)
403 (define-key calc-mode-map "ke" 'calc-euler-number)
404 (define-key calc-mode-map "kf" 'calc-prime-factors)
405 (define-key calc-mode-map "kg" 'calc-gcd)
406 (define-key calc-mode-map "kh" 'calc-shuffle)
407 (define-key calc-mode-map "kl" 'calc-lcm)
408 (define-key calc-mode-map "km" 'calc-moebius)
409 (define-key calc-mode-map "kn" 'calc-next-prime)
410 (define-key calc-mode-map "kp" 'calc-prime-test)
411 (define-key calc-mode-map "kr" 'calc-random)
412 (define-key calc-mode-map "ks" 'calc-stirling-number)
413 (define-key calc-mode-map "kt" 'calc-totient)
414 (define-key calc-mode-map "kB" 'calc-utpb)
415 (define-key calc-mode-map "kC" 'calc-utpc)
416 (define-key calc-mode-map "kE" 'calc-extended-gcd)
417 (define-key calc-mode-map "kF" 'calc-utpf)
418 (define-key calc-mode-map "kK" 'calc-keep-args)
419 (define-key calc-mode-map "kN" 'calc-utpn)
420 (define-key calc-mode-map "kP" 'calc-utpp)
421 (define-key calc-mode-map "kT" 'calc-utpt)
422
423 (define-key calc-mode-map "m" nil)
424 (define-key calc-mode-map "m?" 'calc-m-prefix-help)
425 (define-key calc-mode-map "ma" 'calc-algebraic-mode)
426 (define-key calc-mode-map "md" 'calc-degrees-mode)
427 (define-key calc-mode-map "me" 'calc-embedded-preserve-modes)
428 (define-key calc-mode-map "mf" 'calc-frac-mode)
429 (define-key calc-mode-map "mg" 'calc-get-modes)
430 (define-key calc-mode-map "mh" 'calc-hms-mode)
431 (define-key calc-mode-map "mi" 'calc-infinite-mode)
432 (define-key calc-mode-map "mm" 'calc-save-modes)
433 (define-key calc-mode-map "mp" 'calc-polar-mode)
434 (define-key calc-mode-map "mr" 'calc-radians-mode)
435 (define-key calc-mode-map "ms" 'calc-symbolic-mode)
436 (define-key calc-mode-map "mt" 'calc-total-algebraic-mode)
437 (define-key calc-mode-map "\emt" 'calc-total-algebraic-mode)
438 (define-key calc-mode-map "\em\et" 'calc-total-algebraic-mode)
439 (define-key calc-mode-map "mv" 'calc-matrix-mode)
440 (define-key calc-mode-map "mw" 'calc-working)
441 (define-key calc-mode-map "mx" 'calc-always-load-extensions)
442 (define-key calc-mode-map "mA" 'calc-alg-simplify-mode)
443 (define-key calc-mode-map "mB" 'calc-bin-simplify-mode)
444 (define-key calc-mode-map "mC" 'calc-auto-recompute)
445 (define-key calc-mode-map "mD" 'calc-default-simplify-mode)
446 (define-key calc-mode-map "mE" 'calc-ext-simplify-mode)
447 (define-key calc-mode-map "mF" 'calc-settings-file-name)
448 (define-key calc-mode-map "mM" 'calc-more-recursion-depth)
449 (define-key calc-mode-map "mN" 'calc-num-simplify-mode)
450 (define-key calc-mode-map "mO" 'calc-no-simplify-mode)
451 (define-key calc-mode-map "mR" 'calc-mode-record-mode)
452 (define-key calc-mode-map "mS" 'calc-shift-prefix)
453 (define-key calc-mode-map "mU" 'calc-units-simplify-mode)
454 (define-key calc-mode-map "mX" 'calc-load-everything)
455
456 (define-key calc-mode-map "r" nil)
457 (define-key calc-mode-map "r?" 'calc-r-prefix-help)
458
459 (define-key calc-mode-map "s" nil)
460 (define-key calc-mode-map "s?" 'calc-s-prefix-help)
461 (define-key calc-mode-map "sc" 'calc-copy-variable)
462 (define-key calc-mode-map "sd" 'calc-declare-variable)
463 (define-key calc-mode-map "se" 'calc-edit-variable)
464 (define-key calc-mode-map "si" 'calc-insert-variables)
465 (define-key calc-mode-map "sk" 'calc-copy-special-constant)
466 (define-key calc-mode-map "sl" 'calc-let)
467 (define-key calc-mode-map "sm" 'calc-store-map)
468 (define-key calc-mode-map "sn" 'calc-store-neg)
469 (define-key calc-mode-map "sp" 'calc-permanent-variable)
470 (define-key calc-mode-map "sr" 'calc-recall)
471 (define-key calc-mode-map "ss" 'calc-store)
472 (define-key calc-mode-map "st" 'calc-store-into)
473 (define-key calc-mode-map "su" 'calc-unstore)
474 (define-key calc-mode-map "sx" 'calc-store-exchange)
475 (define-key calc-mode-map "sA" 'calc-edit-AlgSimpRules)
476 (define-key calc-mode-map "sD" 'calc-edit-Decls)
477 (define-key calc-mode-map "sE" 'calc-edit-EvalRules)
478 (define-key calc-mode-map "sF" 'calc-edit-FitRules)
479 (define-key calc-mode-map "sG" 'calc-edit-GenCount)
480 (define-key calc-mode-map "sH" 'calc-edit-Holidays)
481 (define-key calc-mode-map "sI" 'calc-edit-IntegLimit)
482 (define-key calc-mode-map "sL" 'calc-edit-LineStyles)
483 (define-key calc-mode-map "sP" 'calc-edit-PointStyles)
484 (define-key calc-mode-map "sR" 'calc-edit-PlotRejects)
485 (define-key calc-mode-map "sS" 'calc-sin)
486 (define-key calc-mode-map "sT" 'calc-edit-TimeZone)
487 (define-key calc-mode-map "sU" 'calc-edit-Units)
488 (define-key calc-mode-map "sX" 'calc-edit-ExtSimpRules)
489 (define-key calc-mode-map "s+" 'calc-store-plus)
490 (define-key calc-mode-map "s-" 'calc-store-minus)
491 (define-key calc-mode-map "s*" 'calc-store-times)
492 (define-key calc-mode-map "s/" 'calc-store-div)
493 (define-key calc-mode-map "s^" 'calc-store-power)
494 (define-key calc-mode-map "s|" 'calc-store-concat)
495 (define-key calc-mode-map "s&" 'calc-store-inv)
496 (define-key calc-mode-map "s[" 'calc-store-decr)
497 (define-key calc-mode-map "s]" 'calc-store-incr)
498 (define-key calc-mode-map "s:" 'calc-assign)
499 (define-key calc-mode-map "s=" 'calc-evalto)
500
501 (define-key calc-mode-map "t" nil)
502 (define-key calc-mode-map "t?" 'calc-t-prefix-help)
503 (define-key calc-mode-map "tb" 'calc-trail-backward)
504 (define-key calc-mode-map "td" 'calc-trail-display)
505 (define-key calc-mode-map "tf" 'calc-trail-forward)
506 (define-key calc-mode-map "th" 'calc-trail-here)
507 (define-key calc-mode-map "ti" 'calc-trail-in)
508 (define-key calc-mode-map "tk" 'calc-trail-kill)
509 (define-key calc-mode-map "tm" 'calc-trail-marker)
510 (define-key calc-mode-map "tn" 'calc-trail-next)
511 (define-key calc-mode-map "to" 'calc-trail-out)
512 (define-key calc-mode-map "tp" 'calc-trail-previous)
513 (define-key calc-mode-map "tr" 'calc-trail-isearch-backward)
514 (define-key calc-mode-map "ts" 'calc-trail-isearch-forward)
515 (define-key calc-mode-map "ty" 'calc-trail-yank)
516 (define-key calc-mode-map "t[" 'calc-trail-first)
517 (define-key calc-mode-map "t]" 'calc-trail-last)
518 (define-key calc-mode-map "t<" 'calc-trail-scroll-left)
519 (define-key calc-mode-map "t>" 'calc-trail-scroll-right)
520 (define-key calc-mode-map "t{" 'calc-trail-backward)
521 (define-key calc-mode-map "t}" 'calc-trail-forward)
522 (define-key calc-mode-map "t." 'calc-full-trail-vectors)
523 (define-key calc-mode-map "tC" 'calc-convert-time-zones)
524 (define-key calc-mode-map "tD" 'calc-date)
525 (define-key calc-mode-map "tI" 'calc-inc-month)
526 (define-key calc-mode-map "tJ" 'calc-julian)
527 (define-key calc-mode-map "tM" 'calc-new-month)
528 (define-key calc-mode-map "tN" 'calc-now)
529 (define-key calc-mode-map "tP" 'calc-date-part)
530 (define-key calc-mode-map "tT" 'calc-tan)
531 (define-key calc-mode-map "tU" 'calc-unix-time)
532 (define-key calc-mode-map "tW" 'calc-new-week)
533 (define-key calc-mode-map "tY" 'calc-new-year)
534 (define-key calc-mode-map "tZ" 'calc-time-zone)
535 (define-key calc-mode-map "t+" 'calc-business-days-plus)
536 (define-key calc-mode-map "t-" 'calc-business-days-minus)
537
538 (define-key calc-mode-map "u" 'nil)
539 (define-key calc-mode-map "u?" 'calc-u-prefix-help)
540 (define-key calc-mode-map "ua" 'calc-autorange-units)
541 (define-key calc-mode-map "ub" 'calc-base-units)
542 (define-key calc-mode-map "uc" 'calc-convert-units)
543 (define-key calc-mode-map "ud" 'calc-define-unit)
544 (define-key calc-mode-map "ue" 'calc-explain-units)
545 (define-key calc-mode-map "ug" 'calc-get-unit-definition)
546 (define-key calc-mode-map "up" 'calc-permanent-units)
547 (define-key calc-mode-map "ur" 'calc-remove-units)
548 (define-key calc-mode-map "us" 'calc-simplify-units)
549 (define-key calc-mode-map "ut" 'calc-convert-temperature)
550 (define-key calc-mode-map "uu" 'calc-undefine-unit)
551 (define-key calc-mode-map "uv" 'calc-enter-units-table)
552 (define-key calc-mode-map "ux" 'calc-extract-units)
553 (define-key calc-mode-map "uV" 'calc-view-units-table)
554 (define-key calc-mode-map "uC" 'calc-vector-covariance)
555 (define-key calc-mode-map "uG" 'calc-vector-geometric-mean)
556 (define-key calc-mode-map "uM" 'calc-vector-mean)
557 (define-key calc-mode-map "uN" 'calc-vector-min)
558 (define-key calc-mode-map "uS" 'calc-vector-sdev)
559 (define-key calc-mode-map "uU" 'calc-undo)
560 (define-key calc-mode-map "uX" 'calc-vector-max)
561 (define-key calc-mode-map "u#" 'calc-vector-count)
562 (define-key calc-mode-map "u+" 'calc-vector-sum)
563 (define-key calc-mode-map "u*" 'calc-vector-product)
564
565 (define-key calc-mode-map "v" 'nil)
566 (define-key calc-mode-map "v?" 'calc-v-prefix-help)
567 (define-key calc-mode-map "va" 'calc-arrange-vector)
568 (define-key calc-mode-map "vb" 'calc-build-vector)
569 (define-key calc-mode-map "vc" 'calc-mcol)
570 (define-key calc-mode-map "vd" 'calc-diag)
571 (define-key calc-mode-map "ve" 'calc-expand-vector)
572 (define-key calc-mode-map "vf" 'calc-vector-find)
573 (define-key calc-mode-map "vh" 'calc-head)
574 (define-key calc-mode-map "vi" 'calc-ident)
575 (define-key calc-mode-map "vk" 'calc-cons)
576 (define-key calc-mode-map "vl" 'calc-vlength)
577 (define-key calc-mode-map "vm" 'calc-mask-vector)
578 (define-key calc-mode-map "vn" 'calc-rnorm)
579 (define-key calc-mode-map "vp" 'calc-pack)
580 (define-key calc-mode-map "vr" 'calc-mrow)
581 (define-key calc-mode-map "vs" 'calc-subvector)
582 (define-key calc-mode-map "vt" 'calc-transpose)
583 (define-key calc-mode-map "vu" 'calc-unpack)
584 (define-key calc-mode-map "vv" 'calc-reverse-vector)
585 (define-key calc-mode-map "vx" 'calc-index)
586 (define-key calc-mode-map "vA" 'calc-apply)
587 (define-key calc-mode-map "vC" 'calc-cross)
588 (define-key calc-mode-map "vD" 'calc-mdet)
589 (define-key calc-mode-map "vE" 'calc-set-enumerate)
590 (define-key calc-mode-map "vF" 'calc-set-floor)
591 (define-key calc-mode-map "vG" 'calc-grade)
592 (define-key calc-mode-map "vH" 'calc-histogram)
593 (define-key calc-mode-map "vI" 'calc-inner-product)
594 (define-key calc-mode-map "vJ" 'calc-conj-transpose)
595 (define-key calc-mode-map "vL" 'calc-mlud)
596 (define-key calc-mode-map "vM" 'calc-map)
597 (define-key calc-mode-map "vN" 'calc-cnorm)
598 (define-key calc-mode-map "vO" 'calc-outer-product)
599 (define-key calc-mode-map "vR" 'calc-reduce)
600 (define-key calc-mode-map "vS" 'calc-sort)
601 (define-key calc-mode-map "vT" 'calc-mtrace)
602 (define-key calc-mode-map "vU" 'calc-accumulate)
603 (define-key calc-mode-map "vV" 'calc-set-union)
604 (define-key calc-mode-map "vX" 'calc-set-xor)
605 (define-key calc-mode-map "v^" 'calc-set-intersect)
606 (define-key calc-mode-map "v-" 'calc-set-difference)
607 (define-key calc-mode-map "v~" 'calc-set-complement)
608 (define-key calc-mode-map "v:" 'calc-set-span)
609 (define-key calc-mode-map "v#" 'calc-set-cardinality)
610 (define-key calc-mode-map "v+" 'calc-remove-duplicates)
611 (define-key calc-mode-map "v&" 'calc-inv)
612 (define-key calc-mode-map "v<" 'calc-matrix-left-justify)
613 (define-key calc-mode-map "v=" 'calc-matrix-center-justify)
614 (define-key calc-mode-map "v>" 'calc-matrix-right-justify)
615 (define-key calc-mode-map "v." 'calc-full-vectors)
616 (define-key calc-mode-map "v/" 'calc-break-vectors)
617 (define-key calc-mode-map "v," 'calc-vector-commas)
618 (define-key calc-mode-map "v[" 'calc-vector-brackets)
619 (define-key calc-mode-map "v]" 'calc-matrix-brackets)
620 (define-key calc-mode-map "v{" 'calc-vector-braces)
621 (define-key calc-mode-map "v}" 'calc-matrix-brackets)
622 (define-key calc-mode-map "v(" 'calc-vector-parens)
623 (define-key calc-mode-map "v)" 'calc-matrix-brackets)
624 ;; We can't rely on the automatic upper->lower conversion because
625 ;; in the global map V is explicitly bound, so we need to bind it
626 ;; explicitly as well :-( --stef
627 (define-key calc-mode-map "V" (lookup-key calc-mode-map "v"))
628
629 (define-key calc-mode-map "z" 'nil)
630 (define-key calc-mode-map "z?" 'calc-z-prefix-help)
631
632 (define-key calc-mode-map "Z" 'nil)
633 (define-key calc-mode-map "Z?" 'calc-shift-Z-prefix-help)
634 (define-key calc-mode-map "ZC" 'calc-user-define-composition)
635 (define-key calc-mode-map "ZD" 'calc-user-define)
636 (define-key calc-mode-map "ZE" 'calc-user-define-edit)
637 (define-key calc-mode-map "ZF" 'calc-user-define-formula)
638 (define-key calc-mode-map "ZG" 'calc-get-user-defn)
639 (define-key calc-mode-map "ZI" 'calc-user-define-invocation)
640 (define-key calc-mode-map "ZK" 'calc-user-define-kbd-macro)
641 (define-key calc-mode-map "ZP" 'calc-user-define-permanent)
642 (define-key calc-mode-map "ZS" 'calc-edit-user-syntax)
643 (define-key calc-mode-map "ZT" 'calc-timing)
644 (define-key calc-mode-map "ZU" 'calc-user-undefine)
645 (define-key calc-mode-map "Z[" 'calc-kbd-if)
646 (define-key calc-mode-map "Z:" 'calc-kbd-else)
647 (define-key calc-mode-map "Z|" 'calc-kbd-else-if)
648 (define-key calc-mode-map "Z]" 'calc-kbd-end-if)
649 (define-key calc-mode-map "Z<" 'calc-kbd-repeat)
650 (define-key calc-mode-map "Z>" 'calc-kbd-end-repeat)
651 (define-key calc-mode-map "Z(" 'calc-kbd-for)
652 (define-key calc-mode-map "Z)" 'calc-kbd-end-for)
653 (define-key calc-mode-map "Z{" 'calc-kbd-loop)
654 (define-key calc-mode-map "Z}" 'calc-kbd-end-loop)
655 (define-key calc-mode-map "Z/" 'calc-kbd-break)
656 (define-key calc-mode-map "Z`" 'calc-kbd-push)
657 (define-key calc-mode-map "Z'" 'calc-kbd-pop)
658 (define-key calc-mode-map "Z=" 'calc-kbd-report)
659 (define-key calc-mode-map "Z#" 'calc-kbd-query)
660
661 (calc-init-prefixes)
662
663 (mapc (function
664 (lambda (x)
665 (define-key calc-mode-map (format "c%c" x) 'calc-clean-num)
666 (define-key calc-mode-map (format "j%c" x) 'calc-select-part)
667 (define-key calc-mode-map (format "r%c" x) 'calc-recall-quick)
668 (define-key calc-mode-map (format "s%c" x) 'calc-store-quick)
669 (define-key calc-mode-map (format "t%c" x) 'calc-store-into-quick)
670 (define-key calc-mode-map (format "u%c" x) 'calc-quick-units)))
671 "0123456789")
672
673 (let ((i ?A))
674 (while (<= i ?z)
675 (if (eq (car-safe (aref (nth 1 calc-mode-map) i)) 'keymap)
676 (aset (nth 1 calc-mode-map) i
677 (cons 'keymap (cons (cons ?\e (aref (nth 1 calc-mode-map) i))
678 (cdr (aref (nth 1 calc-mode-map) i))))))
679 (setq i (1+ i))))
680
681 (setq calc-alg-map (copy-keymap calc-mode-map)
682 calc-alg-esc-map (copy-keymap esc-map))
683 (let ((i 32))
684 (while (< i 127)
685 (or (memq i '(?' ?` ?= ??))
686 (aset (nth 1 calc-alg-map) i 'calc-auto-algebraic-entry))
687 (or (memq i '(?# ?x ?0 ?1 ?2 ?3 ?4 ?5 ?6 ?7 ?8 ?9))
688 (aset (nth 1 calc-alg-esc-map) i (aref (nth 1 calc-mode-map) i)))
689 (setq i (1+ i))))
690 (define-key calc-alg-map "\e" calc-alg-esc-map)
691 (define-key calc-alg-map "\e\t" 'calc-roll-up)
692 (define-key calc-alg-map "\e\C-m" 'calc-last-args-stub)
693 (define-key calc-alg-map "\e\177" 'calc-pop-above)
694
695 ;;;; (Autoloads here)
696 (mapc (function (lambda (x)
697 (mapcar (function (lambda (func)
698 (autoload func (car x)))) (cdr x))))
699 '(
700
701 ("calc-alg" calc-has-rules math-defsimplify
702 calc-modify-simplify-mode calcFunc-collect calcFunc-esimplify
703 calcFunc-islin calcFunc-islinnt calcFunc-lin calcFunc-linnt
704 calcFunc-simplify calcFunc-subst calcFunc-powerexpand math-beforep
705 math-build-polynomial-expr math-expand-formula math-expr-contains
706 math-expr-contains-count math-expr-depends math-expr-height
707 math-expr-subst math-expr-weight math-integer-plus math-is-linear
708 math-is-multiple math-is-polynomial math-linear-in math-multiple-of
709 math-poly-depends math-poly-mix math-poly-mul
710 math-poly-simplify math-poly-zerop math-polynomial-base
711 math-polynomial-p math-recompile-eval-rules math-simplify
712 math-simplify-exp math-simplify-extended math-simplify-sqrt
713 math-to-simple-fraction)
714
715 ("calcalg2" calcFunc-asum calcFunc-deriv
716 calcFunc-ffinv calcFunc-finv calcFunc-fsolve calcFunc-gpoly
717 calcFunc-integ calcFunc-poly calcFunc-prod calcFunc-roots
718 calcFunc-solve calcFunc-sum calcFunc-table calcFunc-taylor
719 calcFunc-tderiv math-expr-calls math-integral-q02 math-integral-q12
720 math-integral-rational-funcs math-lcm-denoms math-looks-evenp
721 math-poly-all-roots math-prod-rec math-reject-solution math-solve-eqn
722 math-solve-for math-sum-rec math-try-integral)
723
724 ("calcalg3" calcFunc-efit calcFunc-fit
725 calcFunc-fitdummy calcFunc-fitparam calcFunc-fitvar
726 calcFunc-hasfitparams calcFunc-hasfitvars calcFunc-maximize
727 calcFunc-minimize calcFunc-ninteg calcFunc-polint calcFunc-ratint
728 calcFunc-root calcFunc-wmaximize calcFunc-wminimize calcFunc-wroot
729 calcFunc-xfit math-find-minimum math-find-root math-ninteg-evaluate
730 math-ninteg-midpoint math-ninteg-romberg math-poly-interp)
731
732 ("calc-arith" calcFunc-abs calcFunc-abssqr
733 calcFunc-add calcFunc-ceil calcFunc-decr calcFunc-deven calcFunc-dimag
734 calcFunc-dint calcFunc-div calcFunc-dnatnum calcFunc-dneg
735 calcFunc-dnonneg calcFunc-dnonzero calcFunc-dnumint calcFunc-dodd
736 calcFunc-dpos calcFunc-drange calcFunc-drat calcFunc-dreal
737 calcFunc-dscalar calcFunc-fceil calcFunc-ffloor calcFunc-float
738 calcFunc-fround calcFunc-frounde calcFunc-froundu calcFunc-ftrunc
739 calcFunc-idiv calcFunc-incr calcFunc-ldiv calcFunc-mant calcFunc-max calcFunc-min
740 calcFunc-mod calcFunc-mul calcFunc-neg calcFunc-percent calcFunc-pow
741 calcFunc-relch calcFunc-round calcFunc-rounde calcFunc-roundu
742 calcFunc-scf calcFunc-sub calcFunc-xpon math-abs math-abs-approx
743 math-add-objects-fancy math-add-or-sub math-add-symb-fancy
744 math-ceiling math-combine-prod math-combine-sum math-div-by-zero
745 math-div-objects-fancy math-div-symb-fancy math-div-zero
746 math-float-fancy math-floor-fancy math-floor-special math-guess-if-neg
747 math-intv-constp math-known-evenp math-known-imagp math-known-integerp
748 math-known-matrixp math-known-negp math-known-nonnegp
749 math-known-nonposp math-known-nonzerop math-known-num-integerp
750 math-known-oddp math-known-posp math-known-realp math-known-scalarp
751 math-max math-min math-mod-fancy math-mul-float math-mul-objects-fancy
752 math-mul-or-div math-mul-symb-fancy math-mul-zero math-neg-fancy
753 math-neg-float math-okay-neg math-possible-signs math-possible-types
754 math-pow-fancy math-pow-mod math-pow-of-zero math-pow-zero
755 math-quarter-integer math-round math-setup-declarations math-sqr
756 math-sqr-float math-trunc-fancy math-trunc-special)
757
758 ("calc-bin" calcFunc-and calcFunc-ash
759 calcFunc-clip calcFunc-diff calcFunc-lsh calcFunc-not calcFunc-or
760 calcFunc-rash calcFunc-rot calcFunc-rsh calcFunc-xor math-clip
761 math-compute-max-digits math-convert-radix-digits math-float-parts
762 math-format-bignum-binary math-format-bignum-hex
763 math-format-bignum-octal math-format-bignum-radix math-format-binary
764 math-format-radix math-format-radix-float math-integer-log2
765 math-power-of-2 math-radix-float-power)
766
767 ("calc-comb" calc-report-prime-test
768 calcFunc-choose calcFunc-dfact calcFunc-egcd calcFunc-fact
769 calcFunc-gcd calcFunc-lcm calcFunc-moebius calcFunc-nextprime
770 calcFunc-perm calcFunc-prevprime calcFunc-prfac calcFunc-prime
771 calcFunc-random calcFunc-shuffle calcFunc-stir1 calcFunc-stir2
772 calcFunc-totient math-init-random-base math-member math-prime-test
773 math-random-base)
774
775 ("calccomp" calcFunc-cascent calcFunc-cdescent
776 calcFunc-cheight calcFunc-cwidth math-comp-ascent math-comp-descent
777 math-comp-height math-comp-width math-compose-expr
778 math-composition-to-string math-stack-value-offset-fancy
779 math-vector-is-string math-vector-to-string)
780
781 ("calc-cplx" calcFunc-arg calcFunc-conj
782 calcFunc-im calcFunc-polar calcFunc-re calcFunc-rect math-complex
783 math-fix-circular math-imaginary math-imaginary-i math-normalize-polar
784 math-polar math-want-polar)
785
786 ("calc-embed" calc-do-embedded
787 calc-do-embedded-activate calc-embedded-evaluate-expr
788 calc-embedded-modes-change calc-embedded-var-change
789 calc-embedded-preserve-modes)
790
791 ("calc-fin" calc-to-percentage calcFunc-ddb
792 calcFunc-fv calcFunc-fvb calcFunc-fvl calcFunc-irr calcFunc-irrb
793 calcFunc-nper calcFunc-nperb calcFunc-nperl calcFunc-npv calcFunc-npvb
794 calcFunc-pmt calcFunc-pmtb calcFunc-pv calcFunc-pvb calcFunc-pvl
795 calcFunc-rate calcFunc-rateb calcFunc-ratel calcFunc-sln calcFunc-syd)
796
797 ("calc-forms" calcFunc-badd calcFunc-bsub
798 calcFunc-date calcFunc-day calcFunc-dsadj calcFunc-hms
799 calcFunc-holiday calcFunc-hour calcFunc-incmonth calcFunc-incyear
800 calcFunc-intv calcFunc-julian calcFunc-makemod calcFunc-minute
801 calcFunc-month calcFunc-newmonth calcFunc-newweek calcFunc-newyear
802 calcFunc-now calcFunc-pwday calcFunc-sdev calcFunc-second
803 calcFunc-time calcFunc-tzconv calcFunc-tzone calcFunc-unixtime
804 calcFunc-weekday calcFunc-year calcFunc-yearday math-combine-intervals
805 math-date-parts math-date-to-dt math-div-mod math-dt-to-date
806 math-format-date math-from-business-day math-from-hms math-make-intv
807 math-make-mod math-make-sdev math-mod-intv math-normalize-hms
808 math-normalize-mod math-parse-date math-read-angle-brackets
809 math-setup-add-holidays math-setup-holidays math-setup-year-holidays
810 math-sort-intv math-to-business-day math-to-hms)
811
812 ("calc-frac" calc-add-fractions
813 calc-div-fractions calc-mul-fractions calcFunc-fdiv calcFunc-frac
814 math-make-frac)
815
816 ("calc-funcs" calc-prob-dist calcFunc-bern
817 calcFunc-besJ calcFunc-besY calcFunc-beta calcFunc-betaB
818 calcFunc-betaI calcFunc-erf calcFunc-erfc calcFunc-euler
819 calcFunc-gamma calcFunc-gammaG calcFunc-gammaP calcFunc-gammaQ
820 calcFunc-gammag calcFunc-ltpb calcFunc-ltpc calcFunc-ltpf
821 calcFunc-ltpn calcFunc-ltpp calcFunc-ltpt calcFunc-utpb calcFunc-utpc
822 calcFunc-utpf calcFunc-utpn calcFunc-utpp calcFunc-utpt
823 math-bernoulli-number math-gammap1-raw)
824
825 ("calc-graph" calc-graph-show-tty)
826
827 ("calc-incom" calc-digit-dots)
828
829 ("calc-keypd" calc-do-keypad
830 calc-keypad-x-left-click calc-keypad-x-middle-click
831 calc-keypad-x-right-click)
832
833 ("calc-lang" calc-set-language
834 math-read-big-balance math-read-big-rec)
835
836 ("calc-map" calc-get-operator calcFunc-accum
837 calcFunc-afixp calcFunc-anest calcFunc-apply calcFunc-call
838 calcFunc-fixp calcFunc-inner calcFunc-map calcFunc-mapa calcFunc-mapc
839 calcFunc-mapd calcFunc-mapeq calcFunc-mapeqp calcFunc-mapeqr
840 calcFunc-mapr calcFunc-nest calcFunc-outer calcFunc-raccum
841 calcFunc-reduce calcFunc-reducea calcFunc-reducec calcFunc-reduced
842 calcFunc-reducer calcFunc-rreduce calcFunc-rreducea calcFunc-rreducec
843 calcFunc-rreduced calcFunc-rreducer math-build-call
844 math-calcFunc-to-var math-multi-subst math-multi-subst-rec
845 math-var-to-calcFunc)
846
847 ("calc-mtx" calcFunc-det calcFunc-lud calcFunc-tr
848 math-col-matrix math-lud-solve math-matrix-inv-raw math-matrix-lud
849 math-mul-mat-vec math-mul-mats math-row-matrix)
850
851 ("calc-math" calcFunc-alog calcFunc-arccos
852 calcFunc-arccosh calcFunc-arcsin calcFunc-arcsincos calcFunc-arcsinh
853 calcFunc-arctan calcFunc-arctan2 calcFunc-arctanh calcFunc-csc
854 calcFunc-csch calcFunc-cos calcFunc-cosh calcFunc-cot calcFunc-coth
855 calcFunc-deg calcFunc-exp calcFunc-exp10 calcFunc-expm1
856 calcFunc-hypot calcFunc-ilog calcFunc-isqrt calcFunc-ln calcFunc-lnp1
857 calcFunc-log calcFunc-log10 calcFunc-nroot calcFunc-rad calcFunc-sec
858 calcFunc-sech calcFunc-sin
859 calcFunc-sincos calcFunc-sinh calcFunc-sqr calcFunc-sqrt calcFunc-tan
860 calcFunc-tanh math-arccos-raw math-arcsin-raw math-arctan-raw
861 math-arctan2-raw math-cos-raw math-cot-raw math-csc-raw
862 math-exp-minus-1-raw math-exp-raw
863 math-from-radians math-from-radians-2 math-hypot math-infinite-dir
864 math-isqrt-small math-ln-raw math-nearly-equal math-nearly-equal-float
865 math-nearly-zerop math-nearly-zerop-float math-nth-root
866 math-sin-cos-raw math-sin-raw math-sqrt math-sqrt-float math-sqrt-raw
867 math-tan-raw math-to-radians math-to-radians-2)
868
869 ("calc-mode" math-get-modes-vec)
870
871 ("calc-poly" calcFunc-apart calcFunc-expand
872 calcFunc-expandpow calcFunc-factor calcFunc-factors calcFunc-nrat
873 calcFunc-pcont calcFunc-pdeg calcFunc-pdiv calcFunc-pdivide
874 calcFunc-pdivrem calcFunc-pgcd calcFunc-plead calcFunc-pprim
875 calcFunc-prem math-accum-factors math-atomic-factorp
876 math-div-poly-const math-div-thru math-expand-power math-expand-term
877 math-factor-contains math-factor-expr math-factor-expr-part
878 math-factor-expr-try math-factor-finish math-factor-poly-coefs
879 math-factor-protect math-mul-thru math-padded-polynomial
880 math-partial-fractions math-poly-degree math-poly-deriv-coefs
881 math-poly-gcd-frac-list math-poly-modulus-rec math-ratpoly-p
882 math-to-ratpoly math-to-ratpoly-rec)
883
884 ("calc-prog" calc-default-formula-arglist
885 calc-execute-kbd-macro calc-finish-user-syntax-edit
886 calc-fix-token-name calc-fix-user-formula calc-read-parse-table
887 calc-read-parse-table-part calc-subsetp calc-write-parse-table
888 calc-write-parse-table-part calcFunc-constant calcFunc-eq calcFunc-geq
889 calcFunc-gt calcFunc-if calcFunc-in calcFunc-integer calcFunc-istrue
890 calcFunc-land calcFunc-leq calcFunc-lnot calcFunc-lor calcFunc-lt
891 calcFunc-negative calcFunc-neq calcFunc-nonvar calcFunc-real
892 calcFunc-refers calcFunc-rmeq calcFunc-typeof calcFunc-variable
893 math-body-refers-to math-break math-composite-inequalities
894 math-do-defmath math-handle-for math-handle-foreach
895 math-normalize-logical-op math-return)
896
897 ("calc-rewr" calcFunc-match calcFunc-matches
898 calcFunc-matchnot calcFunc-rewrite calcFunc-vmatches
899 math-apply-rewrites math-compile-patterns math-compile-rewrites
900 math-flatten-lands math-match-patterns math-rewrite
901 math-rewrite-heads)
902
903 ("calc-rules" calc-CommuteRules calc-DistribRules calc-FactorRules
904 calc-FitRules calc-IntegAfterRules calc-InvertRules calc-JumpRules
905 calc-MergeRules calc-NegateRules
906 calc-compile-rule-set)
907
908 ("calc-sel" calc-auto-selection
909 calc-delete-selection calc-encase-atoms calc-find-assoc-parent-formula
910 calc-find-parent-formula calc-find-sub-formula calc-prepare-selection
911 calc-preserve-point calc-replace-selections calc-replace-sub-formula
912 calc-roll-down-with-selections calc-roll-up-with-selections
913 calc-sel-error)
914
915 ("calc-stat" calc-vector-op calcFunc-agmean
916 calcFunc-vcorr calcFunc-vcount calcFunc-vcov calcFunc-vflat
917 calcFunc-vgmean calcFunc-vhmean calcFunc-vmax calcFunc-vmean
918 calcFunc-vmeane calcFunc-vmedian calcFunc-vmin calcFunc-vpcov
919 calcFunc-vprod calcFunc-vpsdev calcFunc-vpvar calcFunc-vsdev
920 calcFunc-vsum calcFunc-vvar math-flatten-many-vecs)
921
922 ("calc-store" calc-read-var-name
923 calc-store-value calc-var-name)
924
925 ("calc-stuff" calc-explain-why calcFunc-clean
926 calcFunc-pclean calcFunc-pfloat calcFunc-pfrac)
927
928 ("calc-units" calcFunc-usimplify
929 math-build-units-table math-build-units-table-buffer
930 math-check-unit-name math-convert-temperature math-convert-units
931 math-extract-units math-remove-units math-simplify-units
932 math-single-units-in-expr-p math-to-standard-units
933 math-units-in-expr-p)
934
935 ("calc-vec" calcFunc-append calcFunc-appendrev
936 calcFunc-arrange calcFunc-cnorm calcFunc-cons calcFunc-cross
937 calcFunc-ctrn calcFunc-cvec calcFunc-diag calcFunc-find
938 calcFunc-getdiag calcFunc-grade calcFunc-head calcFunc-histogram
939 calcFunc-idn calcFunc-index calcFunc-mcol calcFunc-mdims
940 calcFunc-mrcol calcFunc-mrow calcFunc-mrrow calcFunc-pack
941 calcFunc-rcons calcFunc-rdup calcFunc-rev calcFunc-rgrade
942 calcFunc-rhead calcFunc-rnorm calcFunc-rsort calcFunc-rsubvec
943 calcFunc-rtail calcFunc-sort calcFunc-subscr calcFunc-subvec
944 calcFunc-tail calcFunc-trn calcFunc-unpack calcFunc-unpackt
945 calcFunc-vcard calcFunc-vcompl calcFunc-vconcat calcFunc-vconcatrev
946 calcFunc-vdiff calcFunc-vec calcFunc-venum calcFunc-vexp
947 calcFunc-vfloor calcFunc-vint calcFunc-vlen calcFunc-vmask
948 calcFunc-vpack calcFunc-vspan calcFunc-vunion calcFunc-vunpack
949 calcFunc-vxor math-check-for-commas math-clean-set math-copy-matrix
950 math-dimension-error math-dot-product math-flatten-vector math-map-vec
951 math-map-vec-2 math-mat-col math-mimic-ident math-prepare-set
952 math-read-brackets math-reduce-cols math-reduce-vec math-transpose)
953
954 ("calc-yank" calc-alg-edit calc-clean-newlines
955 calc-do-grab-rectangle calc-do-grab-region calc-finish-stack-edit
956 calc-force-refresh calc-locate-cursor-element calc-show-edit-buffer)
957
958 ))
959
960 (mapcar (function (lambda (x)
961 (mapcar (function (lambda (cmd)
962 (autoload cmd (car x) nil t))) (cdr x))))
963 '(
964
965 ("calc-alg" calc-alg-evaluate calc-apart calc-collect calc-expand
966 calc-expand-formula calc-factor calc-normalize-rat calc-poly-div
967 calc-poly-div-rem calc-poly-gcd calc-poly-rem calc-simplify
968 calc-simplify-extended calc-substitute calc-powerexpand)
969
970 ("calcalg2" calc-alt-summation calc-derivative
971 calc-dump-integral-cache calc-integral calc-num-integral
972 calc-poly-roots calc-product calc-solve-for calc-summation
973 calc-tabulate calc-taylor)
974
975 ("calcalg3" calc-curve-fit calc-find-maximum calc-find-minimum
976 calc-find-root calc-poly-interp)
977
978 ("calc-arith" calc-abs calc-abssqr calc-ceiling calc-decrement
979 calc-floor calc-idiv calc-increment calc-mant-part calc-max calc-min
980 calc-round calc-scale-float calc-sign calc-trunc calc-xpon-part)
981
982 ("calc-bin" calc-and calc-binary-radix calc-clip calc-decimal-radix
983 calc-diff calc-hex-radix calc-leading-zeros calc-lshift-arith
984 calc-lshift-binary calc-not calc-octal-radix calc-or calc-radix
985 calc-rotate-binary calc-rshift-arith calc-rshift-binary calc-word-size
986 calc-xor)
987
988 ("calc-comb" calc-choose calc-double-factorial calc-extended-gcd
989 calc-factorial calc-gamma calc-gcd calc-lcm calc-moebius
990 calc-next-prime calc-perm calc-prev-prime calc-prime-factors
991 calc-prime-test calc-random calc-random-again calc-rrandom
992 calc-shuffle calc-totient)
993
994 ("calc-cplx" calc-argument calc-complex-notation calc-i-notation
995 calc-im calc-j-notation calc-polar calc-polar-mode calc-re)
996
997 ("calc-embed" calc-embedded-copy-formula-as-kill
998 calc-embedded-duplicate calc-embedded-edit calc-embedded-forget
999 calc-embedded-kill-formula calc-embedded-mark-formula
1000 calc-embedded-new-formula calc-embedded-next calc-embedded-previous
1001 calc-embedded-select calc-embedded-update-formula calc-embedded-word
1002 calc-find-globals calc-show-plain)
1003
1004 ("calc-fin" calc-convert-percent calc-fin-ddb calc-fin-fv
1005 calc-fin-irr calc-fin-nper calc-fin-npv calc-fin-pmt calc-fin-pv
1006 calc-fin-rate calc-fin-sln calc-fin-syd calc-percent-change)
1007
1008 ("calc-forms" calc-business-days-minus calc-business-days-plus
1009 calc-convert-time-zones calc-date calc-date-notation calc-date-part
1010 calc-from-hms calc-hms-mode calc-hms-notation calc-inc-month
1011 calc-julian calc-new-month calc-new-week calc-new-year calc-now
1012 calc-time calc-time-zone calc-to-hms calc-unix-time)
1013
1014 ("calc-frac" calc-fdiv calc-frac-mode calc-fraction
1015 calc-over-notation calc-slash-notation)
1016
1017 ("calc-funcs" calc-bernoulli-number calc-bessel-J calc-bessel-Y
1018 calc-beta calc-erf calc-erfc calc-euler-number calc-inc-beta
1019 calc-inc-gamma calc-stirling-number calc-utpb calc-utpc calc-utpf
1020 calc-utpn calc-utpp calc-utpt)
1021
1022 ("calc-graph" calc-graph-add calc-graph-add-3d calc-graph-border
1023 calc-graph-clear calc-graph-command calc-graph-delete
1024 calc-graph-device calc-graph-display calc-graph-fast
1025 calc-graph-fast-3d calc-graph-geometry calc-graph-grid
1026 calc-graph-header calc-graph-hide calc-graph-juggle calc-graph-key
1027 calc-graph-kill calc-graph-line-style calc-graph-log-x
1028 calc-graph-log-y calc-graph-log-z calc-graph-name
1029 calc-graph-num-points calc-graph-output calc-graph-plot
1030 calc-graph-point-style calc-graph-print calc-graph-quit
1031 calc-graph-range-x calc-graph-range-y calc-graph-range-z
1032 calc-graph-show-dumb calc-graph-title-x calc-graph-title-y
1033 calc-graph-title-z calc-graph-view-commands calc-graph-view-trail
1034 calc-graph-zero-x calc-graph-zero-y)
1035
1036 ("calc-help" calc-a-prefix-help calc-b-prefix-help calc-c-prefix-help
1037 calc-d-prefix-help calc-describe-function calc-describe-key
1038 calc-describe-key-briefly calc-describe-variable calc-f-prefix-help
1039 calc-full-help calc-g-prefix-help calc-help-prefix
1040 calc-hyperbolic-prefix-help calc-inv-hyp-prefix-help
1041 calc-inverse-prefix-help calc-j-prefix-help calc-k-prefix-help
1042 calc-m-prefix-help calc-r-prefix-help calc-s-prefix-help
1043 calc-t-prefix-help calc-u-prefix-help calc-v-prefix-help)
1044
1045 ("calc-incom" calc-begin-complex calc-begin-vector calc-comma
1046 calc-dots calc-end-complex calc-end-vector calc-semi)
1047
1048 ("calc-keypd" calc-keypad-menu calc-keypad-menu-back
1049 calc-keypad-press)
1050
1051 ("calc-lang" calc-big-language calc-c-language calc-eqn-language
1052 calc-flat-language calc-fortran-language calc-maple-language
1053 calc-mathematica-language calc-normal-language calc-pascal-language
1054 calc-tex-language calc-latex-language calc-unformatted-language)
1055
1056 ("calc-map" calc-accumulate calc-apply calc-inner-product calc-map
1057 calc-map-equation calc-map-stack calc-outer-product calc-reduce)
1058
1059 ("calc-mtx" calc-mdet calc-mlud calc-mtrace)
1060
1061 ("calc-math" calc-arccos calc-arccosh calc-arcsin calc-arcsinh
1062 calc-arctan calc-arctan2 calc-arctanh calc-conj calc-cos calc-cosh
1063 calc-cot calc-coth calc-csc calc-csch
1064 calc-degrees-mode calc-exp calc-expm1 calc-hypot calc-ilog
1065 calc-imaginary calc-isqrt calc-ln calc-lnp1 calc-log calc-log10
1066 calc-pi calc-radians-mode calc-sec calc-sech
1067 calc-sin calc-sincos calc-sinh calc-sqrt
1068 calc-tan calc-tanh calc-to-degrees calc-to-radians)
1069
1070 ("calc-mode" calc-alg-simplify-mode calc-algebraic-mode
1071 calc-always-load-extensions calc-auto-recompute calc-auto-why
1072 calc-bin-simplify-mode calc-break-vectors calc-center-justify
1073 calc-default-simplify-mode calc-display-raw calc-eng-notation
1074 calc-ext-simplify-mode calc-fix-notation calc-full-trail-vectors
1075 calc-full-vectors calc-get-modes calc-group-char calc-group-digits
1076 calc-infinite-mode calc-left-justify calc-left-label
1077 calc-line-breaking calc-line-numbering calc-matrix-brackets
1078 calc-matrix-center-justify calc-matrix-left-justify calc-matrix-mode
1079 calc-matrix-right-justify calc-mode-record-mode calc-no-simplify-mode
1080 calc-normal-notation calc-num-simplify-mode calc-point-char
1081 calc-right-justify calc-right-label calc-save-modes calc-sci-notation
1082 calc-settings-file-name calc-shift-prefix calc-symbolic-mode
1083 calc-total-algebraic-mode calc-truncate-down calc-truncate-stack
1084 calc-truncate-up calc-units-simplify-mode calc-vector-braces
1085 calc-vector-brackets calc-vector-commas calc-vector-parens
1086 calc-working)
1087
1088 ("calc-prog" calc-call-last-kbd-macro calc-edit-user-syntax
1089 calc-equal-to calc-get-user-defn calc-greater-equal calc-greater-than
1090 calc-in-set calc-kbd-break calc-kbd-else calc-kbd-else-if
1091 calc-kbd-end-for calc-kbd-end-if calc-kbd-end-loop calc-kbd-end-repeat
1092 calc-kbd-for calc-kbd-if calc-kbd-loop calc-kbd-pop calc-kbd-push
1093 calc-kbd-query calc-kbd-repeat calc-kbd-report calc-less-equal
1094 calc-less-than calc-logical-and calc-logical-if calc-logical-not
1095 calc-logical-or calc-not-equal-to calc-pass-errors calc-remove-equal
1096 calc-timing calc-user-define calc-user-define-composition
1097 calc-user-define-edit calc-user-define-formula
1098 calc-user-define-invocation calc-user-define-kbd-macro
1099 calc-user-define-permanent calc-user-undefine)
1100
1101 ("calc-rewr" calc-match calc-rewrite calc-rewrite-selection)
1102
1103 ("calc-sel" calc-break-selections calc-clear-selections
1104 calc-copy-selection calc-del-selection calc-edit-selection
1105 calc-enable-selections calc-enter-selection calc-sel-add-both-sides
1106 calc-sel-div-both-sides calc-sel-evaluate calc-sel-expand-formula
1107 calc-sel-mult-both-sides calc-sel-sub-both-sides
1108 calc-select-additional calc-select-here calc-select-here-maybe
1109 calc-select-less calc-select-more calc-select-next calc-select-once
1110 calc-select-once-maybe calc-select-part calc-select-previous
1111 calc-show-selections calc-unselect)
1112
1113 ("calcsel2" calc-commute-left calc-commute-right calc-sel-commute
1114 calc-sel-distribute calc-sel-invert calc-sel-isolate
1115 calc-sel-jump-equals calc-sel-merge calc-sel-negate calc-sel-unpack)
1116
1117 ("calc-stat" calc-vector-correlation calc-vector-count
1118 calc-vector-covariance calc-vector-geometric-mean
1119 calc-vector-harmonic-mean calc-vector-max calc-vector-mean
1120 calc-vector-mean-error calc-vector-median calc-vector-min
1121 calc-vector-pop-covariance calc-vector-pop-sdev
1122 calc-vector-pop-variance calc-vector-product calc-vector-sdev
1123 calc-vector-sum calc-vector-variance)
1124
1125 ("calc-store" calc-assign calc-copy-special-constant
1126 calc-copy-variable calc-declare-variable
1127 calc-edit-AlgSimpRules calc-edit-Decls calc-edit-EvalRules
1128 calc-edit-ExtSimpRules calc-edit-FitRules calc-edit-GenCount
1129 calc-edit-Holidays calc-edit-IntegLimit calc-edit-LineStyles
1130 calc-edit-PlotRejects calc-edit-PointStyles calc-edit-TimeZone
1131 calc-edit-Units calc-edit-variable calc-evalto calc-insert-variables
1132 calc-let calc-permanent-variable calc-recall calc-recall-quick
1133 calc-store calc-store-concat calc-store-decr calc-store-div
1134 calc-store-exchange calc-store-incr calc-store-into
1135 calc-store-into-quick calc-store-inv calc-store-map calc-store-minus
1136 calc-store-neg calc-store-plus calc-store-power calc-store-quick
1137 calc-store-times calc-subscript calc-unstore)
1138
1139 ("calc-stuff" calc-clean calc-clean-num calc-flush-caches
1140 calc-less-recursion-depth calc-more-recursion-depth calc-num-prefix
1141 calc-version calc-why)
1142
1143 ("calc-trail" calc-trail-backward calc-trail-first calc-trail-forward
1144 calc-trail-in calc-trail-isearch-backward calc-trail-isearch-forward
1145 calc-trail-kill calc-trail-last calc-trail-marker calc-trail-next
1146 calc-trail-out calc-trail-previous calc-trail-scroll-left
1147 calc-trail-scroll-right calc-trail-yank)
1148
1149 ("calc-undo" calc-last-args calc-redo calc-undo)
1150
1151 ("calc-units" calc-autorange-units calc-base-units
1152 calc-convert-temperature calc-convert-units calc-define-unit
1153 calc-enter-units-table calc-explain-units calc-extract-units
1154 calc-get-unit-definition calc-permanent-units calc-quick-units
1155 calc-remove-units calc-simplify-units calc-undefine-unit
1156 calc-view-units-table)
1157
1158 ("calc-vec" calc-arrange-vector calc-build-vector calc-cnorm
1159 calc-conj-transpose calc-cons calc-cross calc-diag
1160 calc-display-strings calc-expand-vector calc-grade calc-head
1161 calc-histogram calc-ident calc-index calc-mask-vector calc-mcol
1162 calc-mrow calc-pack calc-pack-bits calc-remove-duplicates
1163 calc-reverse-vector calc-rnorm calc-set-cardinality
1164 calc-set-complement calc-set-difference calc-set-enumerate
1165 calc-set-floor calc-set-intersect calc-set-span calc-set-union
1166 calc-set-xor calc-sort calc-subvector calc-tail calc-transpose
1167 calc-unpack calc-unpack-bits calc-vector-find calc-vlength)
1168
1169 ("calc-yank" calc-copy-as-kill calc-copy-region-as-kill
1170 calc-copy-to-buffer calc-edit calc-edit-cancel calc-edit-mode
1171 calc-kill calc-kill-region calc-yank))))
1172
1173 (defun calc-init-prefixes ()
1174 (if calc-shift-prefix
1175 (progn
1176 (define-key calc-mode-map "A" (lookup-key calc-mode-map "a"))
1177 (define-key calc-mode-map "B" (lookup-key calc-mode-map "b"))
1178 (define-key calc-mode-map "C" (lookup-key calc-mode-map "c"))
1179 (define-key calc-mode-map "D" (lookup-key calc-mode-map "d"))
1180 (define-key calc-mode-map "F" (lookup-key calc-mode-map "f"))
1181 (define-key calc-mode-map "G" (lookup-key calc-mode-map "g"))
1182 (define-key calc-mode-map "J" (lookup-key calc-mode-map "j"))
1183 (define-key calc-mode-map "K" (lookup-key calc-mode-map "k"))
1184 (define-key calc-mode-map "M" (lookup-key calc-mode-map "m"))
1185 (define-key calc-mode-map "S" (lookup-key calc-mode-map "s"))
1186 (define-key calc-mode-map "T" (lookup-key calc-mode-map "t"))
1187 (define-key calc-mode-map "U" (lookup-key calc-mode-map "u")))
1188 (define-key calc-mode-map "A" 'calc-abs)
1189 (define-key calc-mode-map "B" 'calc-log)
1190 (define-key calc-mode-map "C" 'calc-cos)
1191 (define-key calc-mode-map "D" 'calc-redo)
1192 (define-key calc-mode-map "F" 'calc-floor)
1193 (define-key calc-mode-map "G" 'calc-argument)
1194 (define-key calc-mode-map "J" 'calc-conj)
1195 (define-key calc-mode-map "K" 'calc-keep-args)
1196 (define-key calc-mode-map "M" 'calc-more-recursion-depth)
1197 (define-key calc-mode-map "S" 'calc-sin)
1198 (define-key calc-mode-map "T" 'calc-tan)
1199 (define-key calc-mode-map "U" 'calc-undo)))
1200
1201 (calc-init-extensions)
1202
1203
1204
1205
1206 ;;;; Miscellaneous.
1207
1208 ;; calc-command-flags is declared in calc.el
1209 (defvar calc-command-flags)
1210
1211 (defun calc-clear-command-flag (f)
1212 (setq calc-command-flags (delq f calc-command-flags)))
1213
1214
1215 (defun calc-record-message (tag &rest args)
1216 (let ((msg (apply 'format args)))
1217 (message "%s" msg)
1218 (calc-record msg tag))
1219 (calc-clear-command-flag 'clear-message))
1220
1221
1222 (defun calc-normalize-fancy (val)
1223 (let ((simp (if (consp calc-simplify-mode)
1224 (car calc-simplify-mode)
1225 calc-simplify-mode)))
1226 (cond ((eq simp 'binary)
1227 (let ((s (math-normalize val)))
1228 (if (math-realp s)
1229 (math-clip (math-round s))
1230 s)))
1231 ((eq simp 'alg)
1232 (math-simplify val))
1233 ((eq simp 'ext)
1234 (math-simplify-extended val))
1235 ((eq simp 'units)
1236 (math-simplify-units val))
1237 (t ; nil, none, num
1238 (math-normalize val)))))
1239
1240
1241 (defvar calc-help-map nil)
1242
1243 (if calc-help-map
1244 nil
1245 (setq calc-help-map (make-keymap))
1246 (define-key calc-help-map "b" 'calc-describe-bindings)
1247 (define-key calc-help-map "c" 'calc-describe-key-briefly)
1248 (define-key calc-help-map "f" 'calc-describe-function)
1249 (define-key calc-help-map "h" 'calc-full-help)
1250 (define-key calc-help-map "i" 'calc-info)
1251 (define-key calc-help-map "k" 'calc-describe-key)
1252 (define-key calc-help-map "n" 'calc-view-news)
1253 (define-key calc-help-map "s" 'calc-info-summary)
1254 (define-key calc-help-map "t" 'calc-tutorial)
1255 (define-key calc-help-map "v" 'calc-describe-variable)
1256 (define-key calc-help-map "\C-c" 'calc-describe-copying)
1257 (define-key calc-help-map "\C-d" 'calc-describe-distribution)
1258 (define-key calc-help-map "\C-n" 'calc-view-news)
1259 (define-key calc-help-map "\C-w" 'calc-describe-no-warranty)
1260 (define-key calc-help-map "?" 'calc-help-for-help)
1261 (define-key calc-help-map "\C-h" 'calc-help-for-help))
1262
1263 (defvar calc-prefix-help-phase 0)
1264 (defun calc-do-prefix-help (msgs group key)
1265 (if calc-full-help-flag
1266 (list msgs group key)
1267 (if (cdr msgs)
1268 (progn
1269 (setq calc-prefix-help-phase
1270 (if (eq this-command last-command)
1271 (% (1+ calc-prefix-help-phase) (1+ (length msgs)))
1272 0))
1273 (let ((msg (nth calc-prefix-help-phase msgs)))
1274 (message "%s" (if msg
1275 (concat group ": " msg ":"
1276 (make-string
1277 (- (apply 'max (mapcar 'length msgs))
1278 (length msg)) 32)
1279 " [MORE]"
1280 (if key
1281 (concat " " (char-to-string key)
1282 "-")
1283 ""))
1284 (if key (format "%c-" key) "")))))
1285 (setq calc-prefix-help-phase 0)
1286 (if key
1287 (if msgs
1288 (message "%s: %s: %c-" group (car msgs) key)
1289 (message "%s: (none) %c-" group key))
1290 (message "%s: %s" group (car msgs))))
1291 (and key (calc-unread-command key))))
1292
1293 ;;;; Commands.
1294
1295
1296 ;;; General.
1297
1298 (defun calc-reset (arg)
1299 (interactive "P")
1300 (setq arg (if arg (prefix-numeric-value arg) nil))
1301 (cond
1302 ((and
1303 calc-embedded-info
1304 (equal (aref calc-embedded-info 0) (current-buffer))
1305 (<= (point) (aref calc-embedded-info 5))
1306 (>= (point) (aref calc-embedded-info 4)))
1307 (let ((cbuf (aref calc-embedded-info 1))
1308 (calc-embedded-quiet t))
1309 (save-window-excursion
1310 (calc-embedded nil)
1311 (set-buffer cbuf)
1312 (calc-reset arg))
1313 (calc-embedded nil)))
1314 ((eq major-mode 'calc-mode)
1315 (save-excursion
1316 (unless (and arg (> (abs arg) 0))
1317 (setq calc-stack nil))
1318 (setq calc-undo-list nil
1319 calc-redo-list nil)
1320 (let (calc-stack calc-user-parse-tables calc-standard-date-formats
1321 calc-invocation-macro)
1322 (mapc (function (lambda (v) (set v nil))) calc-local-var-list)
1323 (if (and arg (<= arg 0))
1324 (calc-mode-var-list-restore-default-values)
1325 (calc-mode-var-list-restore-saved-values)))
1326 (calc-set-language nil nil t)
1327 (calc-mode)
1328 (calc-flush-caches t)
1329 (run-hooks 'calc-reset-hook))
1330 (calc-wrapper
1331 (let ((win (get-buffer-window (current-buffer))))
1332 (calc-realign 0)
1333 ;; Adjust the window height if the window is visible, but doesn't
1334 ;; take up the whole height of the frame.
1335 (if (and
1336 win
1337 (< (window-height win) (1- (frame-height))))
1338 (let ((height (- (window-height win) 2)))
1339 (set-window-point win (point))
1340 (or (= height calc-window-height)
1341 (let ((swin (selected-window)))
1342 (select-window win)
1343 (enlarge-window (- calc-window-height height))
1344 (select-window swin)))))))
1345 (message "(Calculator reset)"))
1346 (t
1347 (message "(Not inside a Calc buffer)"))))
1348
1349 ;; What a pain; scroll-left behaves differently when called non-interactively.
1350 (defun calc-scroll-left (n)
1351 (interactive "P")
1352 (setq prefix-arg (or n (/ (window-width) 2)))
1353 (call-interactively #'scroll-left))
1354
1355 (defun calc-scroll-right (n)
1356 (interactive "P")
1357 (setq prefix-arg (or n (/ (window-width) 2)))
1358 (call-interactively #'scroll-right))
1359
1360 (defun calc-scroll-up (n)
1361 (interactive "P")
1362 (condition-case err
1363 (scroll-up (or n (/ (window-height) 2)))
1364 (error nil))
1365 (if (pos-visible-in-window-p (max 1 (- (point-max) 2)))
1366 (if (eq major-mode 'calc-mode)
1367 (calc-realign)
1368 (goto-char (point-max))
1369 (set-window-start (selected-window)
1370 (save-excursion
1371 (forward-line (- (1- (window-height))))
1372 (point)))
1373 (forward-line -1))))
1374
1375 (defun calc-scroll-down (n)
1376 (interactive "P")
1377 (or (pos-visible-in-window-p 1)
1378 (scroll-down (or n (/ (window-height) 2)))))
1379
1380
1381 (defun calc-precision (n)
1382 (interactive "NPrecision: ")
1383 (calc-wrapper
1384 (if (< (prefix-numeric-value n) 3)
1385 (error "Precision must be at least 3 digits")
1386 (calc-change-mode 'calc-internal-prec (prefix-numeric-value n)
1387 (and (memq (car calc-float-format) '(float sci eng))
1388 (< (nth 1 calc-float-format)
1389 (if (= calc-number-radix 10) 0 1))))
1390 (calc-record calc-internal-prec "prec"))
1391 (message "Floating-point precision is %d digits" calc-internal-prec)))
1392
1393
1394 (defun calc-inverse (&optional n)
1395 (interactive "P")
1396 (let* ((hyp-flag (if (or
1397 (eq major-mode 'calc-keypad-mode)
1398 (eq major-mode 'calc-trail-mode))
1399 (with-current-buffer calc-main-buffer
1400 calc-hyperbolic-flag)
1401 calc-hyperbolic-flag))
1402 (msg (if hyp-flag
1403 "Inverse Hyperbolic..."
1404 "Inverse...")))
1405 (calc-fancy-prefix 'calc-inverse-flag msg n)))
1406
1407 (defconst calc-fancy-prefix-map
1408 (let ((map (make-sparse-keymap)))
1409 (define-key map [t] 'calc-fancy-prefix-other-key)
1410 (define-key map (vector meta-prefix-char t) 'calc-fancy-prefix-other-key)
1411 (define-key map [switch-frame] nil)
1412 (define-key map [?\C-u] 'universal-argument)
1413 (define-key map [?0] 'digit-argument)
1414 (define-key map [?1] 'digit-argument)
1415 (define-key map [?2] 'digit-argument)
1416 (define-key map [?3] 'digit-argument)
1417 (define-key map [?4] 'digit-argument)
1418 (define-key map [?5] 'digit-argument)
1419 (define-key map [?6] 'digit-argument)
1420 (define-key map [?7] 'digit-argument)
1421 (define-key map [?8] 'digit-argument)
1422 (define-key map [?9] 'digit-argument)
1423 map)
1424 "Keymap used while processing calc-fancy-prefix.")
1425
1426 (defvar calc-is-keypad-press nil)
1427 (defun calc-fancy-prefix (flag msg n)
1428 (let (prefix)
1429 (calc-wrapper
1430 (calc-set-command-flag 'keep-flags)
1431 (calc-set-command-flag 'no-align)
1432 (setq prefix (set flag (not (symbol-value flag)))
1433 prefix-arg n)
1434 (message (if prefix msg "")))
1435 (and prefix
1436 (not calc-is-keypad-press)
1437 (if (boundp 'overriding-terminal-local-map)
1438 (setq overriding-terminal-local-map calc-fancy-prefix-map)
1439 (let ((event (calc-read-key t)))
1440 (if (eq (setq last-command-char (car event)) ?\C-u)
1441 (universal-argument)
1442 (if (or (not (integerp last-command-char))
1443 (and (>= last-command-char 0) (< last-command-char ? )
1444 (not (memq last-command-char '(?\e)))))
1445 (calc-wrapper)) ; clear flags if not a Calc command.
1446 (setq last-command-event (cdr event))
1447 (if (or (not (integerp last-command-char))
1448 (eq last-command-char ?-))
1449 (calc-unread-command)
1450 (digit-argument n))))))))
1451
1452 (defun calc-fancy-prefix-other-key (arg)
1453 (interactive "P")
1454 (if (and
1455 (not (eq last-command-char 'tab))
1456 (not (eq last-command-char 'M-tab))
1457 (or (not (integerp last-command-char))
1458 (and (>= last-command-char 0) (< last-command-char ? )
1459 (not (eq last-command-char meta-prefix-char)))))
1460 (calc-wrapper)) ; clear flags if not a Calc command.
1461 (setq prefix-arg arg)
1462 (calc-unread-command)
1463 (setq overriding-terminal-local-map nil))
1464
1465 (defun calc-invert-func ()
1466 (save-excursion
1467 (calc-select-buffer)
1468 (setq calc-inverse-flag (not (calc-is-inverse))
1469 calc-hyperbolic-flag (calc-is-hyperbolic)
1470 current-prefix-arg nil)))
1471
1472 (defun calc-is-inverse ()
1473 calc-inverse-flag)
1474
1475 (defun calc-hyperbolic (&optional n)
1476 (interactive "P")
1477 (let* ((inv-flag (if (or
1478 (eq major-mode 'calc-keypad-mode)
1479 (eq major-mode 'calc-trail-mode))
1480 (with-current-buffer calc-main-buffer
1481 calc-inverse-flag)
1482 calc-inverse-flag))
1483 (msg (if inv-flag
1484 "Inverse Hyperbolic..."
1485 "Hyperbolic...")))
1486 (calc-fancy-prefix 'calc-hyperbolic-flag msg n)))
1487
1488 (defun calc-hyperbolic-func ()
1489 (save-excursion
1490 (calc-select-buffer)
1491 (setq calc-inverse-flag (calc-is-inverse)
1492 calc-hyperbolic-flag (not (calc-is-hyperbolic))
1493 current-prefix-arg nil)))
1494
1495 (defun calc-is-hyperbolic ()
1496 calc-hyperbolic-flag)
1497
1498 (defun calc-keep-args (&optional n)
1499 (interactive "P")
1500 (calc-fancy-prefix 'calc-keep-args-flag "Keep args..." n))
1501
1502
1503 (defun calc-change-mode (var value &optional refresh option)
1504 (if option
1505 (setq value (if value
1506 (> (prefix-numeric-value value) 0)
1507 (not (symbol-value var)))))
1508 (or (consp var) (setq var (list var) value (list value)))
1509 (if calc-inverse-flag
1510 (let ((old nil))
1511 (or refresh (error "Not a display-mode command"))
1512 (calc-check-stack 1)
1513 (unwind-protect
1514 (let ((v var))
1515 (while v
1516 (setq old (cons (symbol-value (car v)) old))
1517 (set (car v) (car value))
1518 (setq v (cdr v)
1519 value (cdr value)))
1520 (calc-refresh-top 1)
1521 (calc-refresh-evaltos)
1522 (symbol-value (car var)))
1523 (let ((v var))
1524 (setq old (nreverse old))
1525 (while v
1526 (set (car v) (car old))
1527 (setq v (cdr v)
1528 old (cdr old)))
1529 (if (eq (car var) 'calc-language)
1530 (calc-set-language calc-language calc-language-option t)))))
1531 (let ((chg nil)
1532 (v var))
1533 (while v
1534 (or (equal (symbol-value (car v)) (car value))
1535 (progn
1536 (set (car v) (car value))
1537 (if (eq (car v) 'calc-float-format)
1538 (setq calc-full-float-format
1539 (list (if (eq (car (car value)) 'fix)
1540 'float
1541 (car (car value)))
1542 0)))
1543 (setq chg t)))
1544 (setq v (cdr v)
1545 value (cdr value)))
1546 (if chg
1547 (progn
1548 (or (and refresh (calc-do-refresh))
1549 (calc-refresh-evaltos))
1550 (and (eq calc-mode-save-mode 'save)
1551 (not (equal var '(calc-mode-save-mode)))
1552 (calc-save-modes))))
1553 (if calc-embedded-info (calc-embedded-modes-change var))
1554 (symbol-value (car var)))))
1555
1556 (defun calc-toggle-banner ()
1557 "Toggle display of the friendly greeting calc normally shows above the stack."
1558 (interactive)
1559 (setq calc-show-banner (not calc-show-banner))
1560 (calc-refresh))
1561
1562 (defun calc-refresh-top (n)
1563 (interactive "p")
1564 (calc-wrapper
1565 (cond ((< n 0)
1566 (setq n (- n))
1567 (let ((entry (calc-top n 'entry))
1568 (calc-undo-list nil) (calc-redo-list nil))
1569 (calc-pop-stack 1 n t)
1570 (calc-push-list (list (car entry)) n (list (nth 2 entry)))))
1571 ((= n 0)
1572 (calc-refresh))
1573 (t
1574 (let ((entries (calc-top-list n 1 'entry))
1575 (calc-undo-list nil) (calc-redo-list nil))
1576 (calc-pop-stack n 1 t)
1577 (calc-push-list (mapcar 'car entries)
1578 1
1579 (mapcar (function (lambda (x) (nth 2 x)))
1580 entries)))))))
1581
1582 (defvar calc-refreshing-evaltos nil)
1583 (defvar calc-no-refresh-evaltos nil)
1584 (defun calc-refresh-evaltos (&optional which-var)
1585 (and calc-any-evaltos calc-auto-recompute (not calc-no-refresh-evaltos)
1586 (let ((calc-refreshing-evaltos t)
1587 (num (calc-stack-size))
1588 (calc-undo-list nil) (calc-redo-list nil)
1589 value new-val)
1590 (while (> num 0)
1591 (setq value (calc-top num 'entry))
1592 (if (and (not (nth 2 value))
1593 (setq value (car value))
1594 (or (eq (car-safe value) 'calcFunc-evalto)
1595 (and (eq (car-safe value) 'vec)
1596 (eq (car-safe (nth 1 value)) 'calcFunc-evalto))))
1597 (progn
1598 (setq new-val (math-normalize value))
1599 (or (equal new-val value)
1600 (progn
1601 (calc-push-list (list new-val) num)
1602 (calc-pop-stack 1 (1+ num) t)))))
1603 (setq num (1- num)))))
1604 (and calc-embedded-active which-var
1605 (calc-embedded-var-change which-var)))
1606
1607 (defun calc-push (&rest vals)
1608 (calc-push-list vals))
1609
1610 (defun calc-pop-push (n &rest vals)
1611 (calc-pop-push-list n vals))
1612
1613 (defun calc-pop-push-record (n prefix &rest vals)
1614 (calc-pop-push-record-list n prefix vals))
1615
1616
1617 (defun calc-evaluate (n)
1618 (interactive "p")
1619 (calc-slow-wrapper
1620 (if (= n 0)
1621 (setq n (calc-stack-size)))
1622 (calc-with-default-simplification
1623 (if (< n 0)
1624 (calc-pop-push-record-list 1 "eval"
1625 (math-evaluate-expr (calc-top (- n)))
1626 (- n))
1627 (calc-pop-push-record-list n "eval" (mapcar 'math-evaluate-expr
1628 (calc-top-list n)))))
1629 (calc-handle-whys)))
1630
1631
1632 (defun calc-eval-num (n)
1633 (interactive "P")
1634 (calc-slow-wrapper
1635 (let* ((nn (prefix-numeric-value n))
1636 (calc-internal-prec (cond ((>= nn 3) nn)
1637 ((< nn 0) (max (+ calc-internal-prec nn)
1638 3))
1639 (t calc-internal-prec)))
1640 (calc-symbolic-mode nil))
1641 (calc-with-default-simplification
1642 (calc-pop-push-record 1 "num" (math-evaluate-expr (calc-top 1)))))
1643 (calc-handle-whys)))
1644
1645
1646 (defun calc-execute-extended-command (n)
1647 (interactive "P")
1648 (let* ((prompt (concat (calc-num-prefix-name n) "M-x "))
1649 (cmd (intern (completing-read prompt obarray 'commandp t "calc-"))))
1650 (setq prefix-arg n)
1651 (command-execute cmd)))
1652
1653
1654 (defun calc-realign (&optional num)
1655 (interactive "P")
1656 (if (and num (eq major-mode 'calc-mode))
1657 (progn
1658 (calc-check-stack num)
1659 (calc-cursor-stack-index num)
1660 (and calc-line-numbering
1661 (forward-char 4)))
1662 (if (and calc-embedded-info
1663 (eq (current-buffer) (aref calc-embedded-info 0)))
1664 (progn
1665 (goto-char (aref calc-embedded-info 2))
1666 (if (save-excursion (set-buffer (aref calc-embedded-info 1))
1667 calc-show-plain)
1668 (forward-line 1)))
1669 (calc-wrapper
1670 (if (get-buffer-window (current-buffer))
1671 (set-window-hscroll (get-buffer-window (current-buffer)) 0))))))
1672
1673 (defvar math-cache-list nil)
1674
1675 (defun calc-var-value (v)
1676 (and (symbolp v)
1677 (boundp v)
1678 (symbol-value v)
1679 (if (symbolp (symbol-value v))
1680 (set v (funcall (symbol-value v)))
1681 (if (stringp (symbol-value v))
1682 (let ((val (math-read-expr (symbol-value v))))
1683 (if (eq (car-safe val) 'error)
1684 (error "Bad format in variable contents: %s" (nth 2 val))
1685 (set v val)))
1686 (symbol-value v)))))
1687
1688 ;;; In the following table, ( OP LOPS ROPS ) means that if an OP
1689 ;;; term appears as the first argument to any LOPS term, or as the
1690 ;;; second argument to any ROPS term, then they should be treated
1691 ;;; as one large term for purposes of associative selection.
1692 (defconst calc-assoc-ops '( ( + ( + - ) ( + ) )
1693 ( - ( + - ) ( + ) )
1694 ( * ( * ) ( * ) )
1695 ( / ( / ) ( ) )
1696 ( | ( | ) ( | ) )
1697 ( calcFunc-land ( calcFunc-land )
1698 ( calcFunc-land ) )
1699 ( calcFunc-lor ( calcFunc-lor )
1700 ( calcFunc-lor ) ) ))
1701
1702
1703 (defvar var-CommuteRules 'calc-CommuteRules)
1704 (defvar var-JumpRules 'calc-JumpRules)
1705 (defvar var-DistribRules 'calc-DistribRules)
1706 (defvar var-MergeRules 'calc-MergeRules)
1707 (defvar var-NegateRules 'calc-NegateRules)
1708 (defvar var-InvertRules 'calc-InvertRules)
1709
1710
1711 (defconst calc-tweak-eqn-table '( ( calcFunc-eq calcFunc-eq calcFunc-neq )
1712 ( calcFunc-neq calcFunc-neq calcFunc-eq )
1713 ( calcFunc-lt calcFunc-gt calcFunc-geq )
1714 ( calcFunc-gt calcFunc-lt calcFunc-leq )
1715 ( calcFunc-leq calcFunc-geq calcFunc-gt )
1716 ( calcFunc-geq calcFunc-leq calcFunc-lt ) ))
1717
1718
1719
1720
1721 (defun calc-float (arg)
1722 (interactive "P")
1723 (calc-slow-wrapper
1724 (calc-unary-op "flt"
1725 (if (calc-is-hyperbolic) 'calcFunc-float 'calcFunc-pfloat)
1726 arg)))
1727
1728
1729 (defvar calc-gnuplot-process nil)
1730 (defvar calc-gnuplot-input)
1731 (defvar calc-gnuplot-buffer)
1732
1733 (defun calc-gnuplot-alive ()
1734 (and calc-gnuplot-process
1735 calc-gnuplot-buffer
1736 (buffer-name calc-gnuplot-buffer)
1737 calc-gnuplot-input
1738 (buffer-name calc-gnuplot-input)
1739 (memq (process-status calc-gnuplot-process) '(run stop))))
1740
1741
1742
1743
1744
1745 (defun calc-load-everything ()
1746 (interactive)
1747 (require 'calc-aent)
1748 (require 'calc-alg)
1749 (require 'calc-arith)
1750 (require 'calc-bin)
1751 (require 'calc-comb)
1752 (require 'calc-cplx)
1753 (require 'calc-embed)
1754 (require 'calc-fin)
1755 (require 'calc-forms)
1756 (require 'calc-frac)
1757 (require 'calc-funcs)
1758 (require 'calc-graph)
1759 (require 'calc-help)
1760 (require 'calc-incom)
1761 (require 'calc-keypd)
1762 (require 'calc-lang)
1763 (require 'calc-macs)
1764 (require 'calc-map)
1765 (require 'calc-math)
1766 (require 'calc-misc)
1767 (require 'calc-mode)
1768 (require 'calc-mtx)
1769 (require 'calc-poly)
1770 (require 'calc-prog)
1771 (require 'calc-rewr)
1772 (require 'calc-rules)
1773 (require 'calc-sel)
1774 (require 'calc-stat)
1775 (require 'calc-store)
1776 (require 'calc-stuff)
1777 (require 'calc-trail)
1778 (require 'calc-undo)
1779 (require 'calc-units)
1780 (require 'calc-vec)
1781 (require 'calc-yank)
1782 (require 'calcalg2)
1783 (require 'calcalg3)
1784 (require 'calccomp)
1785 (require 'calcsel2)
1786
1787 (message "All parts of Calc are now loaded"))
1788
1789
1790 ;;; Vector commands.
1791
1792 (defun calc-concat (arg)
1793 (interactive "P")
1794 (calc-wrapper
1795 (if (calc-is-inverse)
1796 (if (calc-is-hyperbolic)
1797 (calc-enter-result 2 "apnd" (list 'calcFunc-append
1798 (calc-top 1) (calc-top 2)))
1799 (calc-enter-result 2 "|" (list 'calcFunc-vconcat
1800 (calc-top 1) (calc-top 2))))
1801 (if (calc-is-hyperbolic)
1802 (calc-binary-op "apnd" 'calcFunc-append arg '(vec))
1803 (calc-binary-op "|" 'calcFunc-vconcat arg '(vec) nil '|)))))
1804
1805 (defun calc-append (arg)
1806 (interactive "P")
1807 (calc-hyperbolic-func)
1808 (calc-concat arg))
1809
1810
1811 (defconst calc-arg-values '( ( var ArgA var-ArgA ) ( var ArgB var-ArgB )
1812 ( var ArgC var-ArgC ) ( var ArgD var-ArgD )
1813 ( var ArgE var-ArgE ) ( var ArgF var-ArgF )
1814 ( var ArgG var-ArgG ) ( var ArgH var-ArgH )
1815 ( var ArgI var-ArgI ) ( var ArgJ var-ArgJ )
1816 ))
1817
1818 (defun calc-invent-args (n)
1819 (nreverse (nthcdr (- (length calc-arg-values) n) (reverse calc-arg-values))))
1820
1821
1822
1823
1824 ;;; User menu.
1825
1826 (defun calc-user-key-map ()
1827 (if (featurep 'xemacs)
1828 (error "User-defined keys are not supported in XEmacs"))
1829 (let ((res (cdr (lookup-key calc-mode-map "z"))))
1830 (if (eq (car (car res)) 27)
1831 (cdr res)
1832 res)))
1833
1834 (defvar calc-z-prefix-buf nil)
1835 (defvar calc-z-prefix-msgs nil)
1836
1837 (defun calc-z-prefix-help ()
1838 (interactive)
1839 (let* ((calc-z-prefix-msgs nil)
1840 (calc-z-prefix-buf "")
1841 (kmap (sort (copy-sequence (calc-user-key-map))
1842 (function (lambda (x y) (< (car x) (car y))))))
1843 (flags (apply 'logior
1844 (mapcar (function
1845 (lambda (k)
1846 (calc-user-function-classify (car k))))
1847 kmap))))
1848 (if (= (logand flags 8) 0)
1849 (calc-user-function-list kmap 7)
1850 (calc-user-function-list kmap 1)
1851 (setq calc-z-prefix-msgs (cons calc-z-prefix-buf calc-z-prefix-msgs)
1852 calc-z-prefix-buf "")
1853 (calc-user-function-list kmap 6))
1854 (if (/= flags 0)
1855 (setq calc-z-prefix-msgs (cons calc-z-prefix-buf calc-z-prefix-msgs)))
1856 (calc-do-prefix-help (nreverse calc-z-prefix-msgs) "user" ?z)))
1857
1858 (defun calc-user-function-classify (key)
1859 (cond ((/= key (downcase key)) ; upper-case
1860 (if (assq (downcase key) (calc-user-key-map)) 9 1))
1861 ((/= key (upcase key)) 2) ; lower-case
1862 ((= key ??) 0)
1863 (t 4))) ; other
1864
1865 (defun calc-user-function-list (map flags)
1866 (and map
1867 (let* ((key (car (car map)))
1868 (kind (calc-user-function-classify key))
1869 (func (cdr (car map))))
1870 (if (or (= (logand kind flags) 0)
1871 (not (symbolp func)))
1872 ()
1873 (let* ((name (symbol-name func))
1874 (name (if (string-match "\\`calc-" name)
1875 (substring name 5) name))
1876 (pos (string-match (char-to-string key) name))
1877 (desc
1878 (if (symbolp func)
1879 (if (= (logand kind 3) 0)
1880 (format "`%c' = %s" key name)
1881 (if pos
1882 (format "%s%c%s"
1883 (downcase (substring name 0 pos))
1884 (upcase key)
1885 (downcase (substring name (1+ pos))))
1886 (format "%c = %s"
1887 (upcase key)
1888 (downcase name))))
1889 (char-to-string (upcase key)))))
1890 (if (= (length calc-z-prefix-buf) 0)
1891 (setq calc-z-prefix-buf (concat (if (= flags 1) "SHIFT + " "")
1892 desc))
1893 (if (> (+ (length calc-z-prefix-buf) (length desc)) 58)
1894 (setq calc-z-prefix-msgs
1895 (cons calc-z-prefix-buf calc-z-prefix-msgs)
1896 calc-z-prefix-buf (concat (if (= flags 1) "SHIFT + " "")
1897 desc))
1898 (setq calc-z-prefix-buf (concat calc-z-prefix-buf ", " desc))))))
1899 (calc-user-function-list (cdr map) flags))))
1900
1901
1902
1903 (defun calc-shift-Z-prefix-help ()
1904 (interactive)
1905 (calc-do-prefix-help
1906 '("Define, Undefine, Formula, Kbd-macro, Edit, Get-defn"
1907 "Composition, Syntax; Invocation; Permanent; Timing"
1908 "kbd-macros: [ (if), : (else), | (else-if), ] (end-if)"
1909 "kbd-macros: < > (repeat), ( ) (for), { } (loop)"
1910 "kbd-macros: / (break)"
1911 "kbd-macros: ` (save), ' (restore)")
1912 "user" ?Z))
1913
1914
1915 ;;;; Caches.
1916
1917 (defmacro math-defcache (name init form)
1918 (let ((cache-prec (intern (concat (symbol-name name) "-cache-prec")))
1919 (cache-val (intern (concat (symbol-name name) "-cache")))
1920 (last-prec (intern (concat (symbol-name name) "-last-prec")))
1921 (last-val (intern (concat (symbol-name name) "-last"))))
1922 (list 'progn
1923 ; (list 'defvar cache-prec (if init (math-numdigs (nth 1 init)) -100))
1924 (list 'defvar cache-prec
1925 `(cond
1926 ((consp ,init) (math-numdigs (nth 1 ,init)))
1927 (,init
1928 (nth 1 (math-numdigs (eval ,init))))
1929 (t
1930 -100)))
1931 (list 'defvar cache-val
1932 `(cond
1933 ((consp ,init) ,init)
1934 (,init (eval ,init))
1935 (t ,init)))
1936 (list 'defvar last-prec -100)
1937 (list 'defvar last-val nil)
1938 (list 'setq 'math-cache-list
1939 (list 'cons
1940 (list 'quote cache-prec)
1941 (list 'cons
1942 (list 'quote last-prec)
1943 'math-cache-list)))
1944 (list 'defun
1945 name ()
1946 (list 'or
1947 (list '= last-prec 'calc-internal-prec)
1948 (list 'setq
1949 last-val
1950 (list 'math-normalize
1951 (list 'progn
1952 (list 'or
1953 (list '>= cache-prec
1954 'calc-internal-prec)
1955 (list 'setq
1956 cache-val
1957 (list 'let
1958 '((calc-internal-prec
1959 (+ calc-internal-prec
1960 4)))
1961 form)
1962 cache-prec
1963 '(+ calc-internal-prec 2)))
1964 cache-val))
1965 last-prec 'calc-internal-prec))
1966 last-val))))
1967 (put 'math-defcache 'lisp-indent-hook 2)
1968
1969 ;;; Betcha didn't know that pi = 16 atan(1/5) - 4 atan(1/239). [F] [Public]
1970 (defconst math-approx-pi
1971 (math-read-number-simple "3.141592653589793238463")
1972 "An approximation for pi.")
1973
1974 (math-defcache math-pi math-approx-pi
1975 (math-add-float (math-mul-float '(float 16 0)
1976 (math-arctan-raw '(float 2 -1)))
1977 (math-mul-float '(float -4 0)
1978 (math-arctan-raw
1979 (math-float '(frac 1 239))))))
1980
1981 (math-defcache math-two-pi nil
1982 (math-mul-float (math-pi) '(float 2 0)))
1983
1984 (math-defcache math-pi-over-2 nil
1985 (math-mul-float (math-pi) '(float 5 -1)))
1986
1987 (math-defcache math-pi-over-4 nil
1988 (math-mul-float (math-pi) '(float 25 -2)))
1989
1990 (math-defcache math-pi-over-180 nil
1991 (math-div-float (math-pi) '(float 18 1)))
1992
1993 (math-defcache math-sqrt-pi nil
1994 (math-sqrt-float (math-pi)))
1995
1996 (math-defcache math-sqrt-2 nil
1997 (math-sqrt-float '(float 2 0)))
1998
1999 (math-defcache math-sqrt-12 nil
2000 (math-sqrt-float '(float 12 0)))
2001
2002 (math-defcache math-sqrt-two-pi nil
2003 (math-sqrt-float (math-two-pi)))
2004
2005 (defconst math-approx-sqrt-e
2006 (math-read-number-simple "1.648721270700128146849")
2007 "An approximation for sqrt(3).")
2008
2009 (math-defcache math-sqrt-e math-approx-sqrt-e
2010 (math-add-float '(float 1 0) (math-exp-minus-1-raw '(float 5 -1))))
2011
2012 (math-defcache math-e nil
2013 (math-pow (math-sqrt-e) 2))
2014
2015 (math-defcache math-phi nil
2016 (math-mul-float (math-add-float (math-sqrt-raw '(float 5 0)) '(float 1 0))
2017 '(float 5 -1)))
2018
2019 (defconst math-approx-gamma-const
2020 (math-read-number-simple
2021 "0.5772156649015328606065120900824024310421593359399235988057672348848677267776646709369470632917467495")
2022 "An approximation for gamma.")
2023
2024 (math-defcache math-gamma-const nil
2025 math-approx-gamma-const)
2026
2027 (defun math-half-circle (symb)
2028 (if (eq calc-angle-mode 'rad)
2029 (if symb
2030 '(var pi var-pi)
2031 (math-pi))
2032 180))
2033
2034 (defun math-full-circle (symb)
2035 (math-mul 2 (math-half-circle symb)))
2036
2037 (defun math-quarter-circle (symb)
2038 (math-div (math-half-circle symb) 2))
2039
2040 (defvar math-expand-formulas nil)
2041
2042 ;;;; Miscellaneous math routines.
2043
2044 ;;; True if A is an odd integer. [P R R] [Public]
2045 (defun math-oddp (a)
2046 (if (consp a)
2047 (and (memq (car a) '(bigpos bigneg))
2048 (= (% (nth 1 a) 2) 1))
2049 (/= (% a 2) 0)))
2050
2051 ;;; True if A is a small or big integer. [P x] [Public]
2052 (defun math-integerp (a)
2053 (or (integerp a)
2054 (memq (car-safe a) '(bigpos bigneg))))
2055
2056 ;;; True if A is (numerically) a non-negative integer. [P N] [Public]
2057 (defun math-natnump (a)
2058 (or (natnump a)
2059 (eq (car-safe a) 'bigpos)))
2060
2061 ;;; True if A is a rational (or integer). [P x] [Public]
2062 (defun math-ratp (a)
2063 (or (integerp a)
2064 (memq (car-safe a) '(bigpos bigneg frac))))
2065
2066 ;;; True if A is a real (or rational). [P x] [Public]
2067 (defun math-realp (a)
2068 (or (integerp a)
2069 (memq (car-safe a) '(bigpos bigneg frac float))))
2070
2071 ;;; True if A is a real or HMS form. [P x] [Public]
2072 (defun math-anglep (a)
2073 (or (integerp a)
2074 (memq (car-safe a) '(bigpos bigneg frac float hms))))
2075
2076 ;;; True if A is a number of any kind. [P x] [Public]
2077 (defun math-numberp (a)
2078 (or (integerp a)
2079 (memq (car-safe a) '(bigpos bigneg frac float cplx polar))))
2080
2081 ;;; True if A is a complex number or angle. [P x] [Public]
2082 (defun math-scalarp (a)
2083 (or (integerp a)
2084 (memq (car-safe a) '(bigpos bigneg frac float cplx polar hms))))
2085
2086 ;;; True if A is a vector. [P x] [Public]
2087 (defun math-vectorp (a)
2088 (eq (car-safe a) 'vec))
2089
2090 ;;; True if A is any vector or scalar data object. [P x]
2091 (defun math-objvecp (a) ; [Public]
2092 (or (integerp a)
2093 (memq (car-safe a) '(bigpos bigneg frac float cplx polar
2094 hms date sdev intv mod vec incomplete))))
2095
2096 ;;; True if A is an object not composed of sub-formulas . [P x] [Public]
2097 (defun math-primp (a)
2098 (or (integerp a)
2099 (memq (car-safe a) '(bigpos bigneg frac float cplx polar
2100 hms date mod var))))
2101
2102 ;;; True if A is numerically (but not literally) an integer. [P x] [Public]
2103 (defun math-messy-integerp (a)
2104 (cond
2105 ((eq (car-safe a) 'float) (>= (nth 2 a) 0))
2106 ((eq (car-safe a) 'frac) (Math-integerp (math-normalize a)))))
2107
2108 ;;; True if A is numerically an integer. [P x] [Public]
2109 (defun math-num-integerp (a)
2110 (or (Math-integerp a)
2111 (Math-messy-integerp a)))
2112
2113 ;;; True if A is (numerically) a non-negative integer. [P N] [Public]
2114 (defun math-num-natnump (a)
2115 (or (natnump a)
2116 (eq (car-safe a) 'bigpos)
2117 (and (eq (car-safe a) 'float)
2118 (Math-natnump (nth 1 a))
2119 (>= (nth 2 a) 0))))
2120
2121 ;;; True if A is an integer or will evaluate to an integer. [P x] [Public]
2122 (defun math-provably-integerp (a)
2123 (or (Math-integerp a)
2124 (and (memq (car-safe a) '(calcFunc-trunc
2125 calcFunc-round
2126 calcFunc-rounde
2127 calcFunc-roundu
2128 calcFunc-floor
2129 calcFunc-ceil))
2130 (= (length a) 2))))
2131
2132 ;;; True if A is a real or will evaluate to a real. [P x] [Public]
2133 (defun math-provably-realp (a)
2134 (or (Math-realp a)
2135 (math-provably-integer a)
2136 (memq (car-safe a) '(abs arg))))
2137
2138 ;;; True if A is a non-real, complex number. [P x] [Public]
2139 (defun math-complexp (a)
2140 (memq (car-safe a) '(cplx polar)))
2141
2142 ;;; True if A is a non-real, rectangular complex number. [P x] [Public]
2143 (defun math-rect-complexp (a)
2144 (eq (car-safe a) 'cplx))
2145
2146 ;;; True if A is a non-real, polar complex number. [P x] [Public]
2147 (defun math-polar-complexp (a)
2148 (eq (car-safe a) 'polar))
2149
2150 ;;; True if A is a matrix. [P x] [Public]
2151 (defun math-matrixp (a)
2152 (and (Math-vectorp a)
2153 (Math-vectorp (nth 1 a))
2154 (cdr (nth 1 a))
2155 (let ((len (length (nth 1 a))))
2156 (setq a (cdr a))
2157 (while (and (setq a (cdr a))
2158 (Math-vectorp (car a))
2159 (= (length (car a)) len)))
2160 (null a))))
2161
2162 (defun math-matrixp-step (a len) ; [P L]
2163 (or (null a)
2164 (and (Math-vectorp (car a))
2165 (= (length (car a)) len)
2166 (math-matrixp-step (cdr a) len))))
2167
2168 ;;; True if A is a square matrix. [P V] [Public]
2169 (defun math-square-matrixp (a)
2170 (let ((dims (math-mat-dimens a)))
2171 (and (cdr dims)
2172 (= (car dims) (nth 1 dims)))))
2173
2174 ;;; True if MAT is an identity matrix.
2175 (defun math-identity-matrix-p (mat &optional mul)
2176 (if (math-square-matrixp mat)
2177 (let ((a (if mul
2178 (nth 1 (nth 1 mat))
2179 1))
2180 (n (1- (length mat)))
2181 (i 1))
2182 (while (and (<= i n)
2183 (math-ident-row-p (nth i mat) i a))
2184 (setq i (1+ i)))
2185 (if (> i n)
2186 a
2187 nil))))
2188
2189 (defun math-ident-row-p (row n &optional a)
2190 (unless a
2191 (setq a 1))
2192 (and
2193 (not (memq nil (mapcar
2194 (lambda (x) (eq x 0))
2195 (nthcdr (1+ n) row))))
2196 (not (memq nil (mapcar
2197 (lambda (x) (eq x 0))
2198 (butlast
2199 (cdr row)
2200 (- (length row) n)))))
2201 (eq (elt row n) a)))
2202
2203 ;;; True if A is any scalar data object. [P x]
2204 (defun math-objectp (a) ; [Public]
2205 (or (integerp a)
2206 (memq (car-safe a) '(bigpos bigneg frac float cplx
2207 polar hms date sdev intv mod))))
2208
2209 ;;; Verify that A is an integer and return A in integer form. [I N; - x]
2210 (defun math-check-integer (a) ; [Public]
2211 (cond ((integerp a) a) ; for speed
2212 ((math-integerp a) a)
2213 ((math-messy-integerp a)
2214 (math-trunc a))
2215 (t (math-reject-arg a 'integerp))))
2216
2217 ;;; Verify that A is a small integer and return A in integer form. [S N; - x]
2218 (defun math-check-fixnum (a &optional allow-inf) ; [Public]
2219 (cond ((integerp a) a) ; for speed
2220 ((Math-num-integerp a)
2221 (let ((a (math-trunc a)))
2222 (if (integerp a)
2223 a
2224 (if (or (Math-lessp (lsh -1 -1) a)
2225 (Math-lessp a (- (lsh -1 -1))))
2226 (math-reject-arg a 'fixnump)
2227 (math-fixnum a)))))
2228 ((and allow-inf (equal a '(var inf var-inf)))
2229 (lsh -1 -1))
2230 ((and allow-inf (equal a '(neg (var inf var-inf))))
2231 (- (lsh -1 -1)))
2232 (t (math-reject-arg a 'fixnump))))
2233
2234 ;;; Verify that A is an integer >= 0 and return A in integer form. [I N; - x]
2235 (defun math-check-natnum (a) ; [Public]
2236 (cond ((natnump a) a)
2237 ((and (not (math-negp a))
2238 (Math-num-integerp a))
2239 (math-trunc a))
2240 (t (math-reject-arg a 'natnump))))
2241
2242 ;;; Verify that A is in floating-point form, or force it to be a float. [F N]
2243 (defun math-check-float (a) ; [Public]
2244 (cond ((eq (car-safe a) 'float) a)
2245 ((Math-vectorp a) (math-map-vec 'math-check-float a))
2246 ((Math-objectp a) (math-float a))
2247 (t a)))
2248
2249 ;;; Verify that A is a constant.
2250 (defun math-check-const (a &optional exp-ok)
2251 (if (or (math-constp a)
2252 (and exp-ok math-expand-formulas))
2253 a
2254 (math-reject-arg a 'constp)))
2255
2256 ;;; Some functions for working with error forms.
2257 (defun math-get-value (x)
2258 "Get the mean value of the error form X.
2259 If X is not an error form, return X."
2260 (if (eq (car-safe x) 'sdev)
2261 (nth 1 x)
2262 x))
2263
2264 (defun math-get-sdev (x &optional one)
2265 "Get the standard deviation of the error form X.
2266 If X is not an error form, return 1."
2267 (if (eq (car-safe x) 'sdev)
2268 (nth 2 x)
2269 (if one 1 0)))
2270
2271 (defun math-contains-sdev-p (ls)
2272 "Non-nil if the list LS contains an error form."
2273 (let ((ls (if (eq (car-safe ls) 'vec) (cdr ls) ls)))
2274 (memq t (mapcar (lambda (x) (eq (car-safe x) 'sdev)) ls))))
2275
2276 ;;; Coerce integer A to be a small integer. [S I]
2277 (defun math-fixnum (a)
2278 (if (consp a)
2279 (if (cdr a)
2280 (if (eq (car a) 'bigneg)
2281 (- (math-fixnum-big (cdr a)))
2282 (math-fixnum-big (cdr a)))
2283 0)
2284 a))
2285
2286 (defun math-fixnum-big (a)
2287 (if (cdr a)
2288 (+ (car a) (* (math-fixnum-big (cdr a)) math-bignum-digit-size))
2289 (car a)))
2290
2291 (defvar math-simplify-only nil)
2292
2293 (defun math-normalize-fancy (a)
2294 (cond ((eq (car a) 'frac)
2295 (math-make-frac (math-normalize (nth 1 a))
2296 (math-normalize (nth 2 a))))
2297 ((eq (car a) 'cplx)
2298 (let ((real (math-normalize (nth 1 a)))
2299 (imag (math-normalize (nth 2 a))))
2300 (if (and (math-zerop imag)
2301 (not math-simplify-only)) ; oh, what a kludge!
2302 real
2303 (list 'cplx real imag))))
2304 ((eq (car a) 'polar)
2305 (math-normalize-polar a))
2306 ((eq (car a) 'hms)
2307 (math-normalize-hms a))
2308 ((eq (car a) 'date)
2309 (list 'date (math-normalize (nth 1 a))))
2310 ((eq (car a) 'mod)
2311 (math-normalize-mod a))
2312 ((eq (car a) 'sdev)
2313 (let ((x (math-normalize (nth 1 a)))
2314 (s (math-normalize (nth 2 a))))
2315 (if (or (and (Math-objectp x) (not (Math-scalarp x)))
2316 (and (Math-objectp s) (not (Math-scalarp s))))
2317 (list 'calcFunc-sdev x s)
2318 (math-make-sdev x s))))
2319 ((eq (car a) 'intv)
2320 (let ((mask (math-normalize (nth 1 a)))
2321 (lo (math-normalize (nth 2 a)))
2322 (hi (math-normalize (nth 3 a))))
2323 (if (if (eq (car-safe lo) 'date)
2324 (not (eq (car-safe hi) 'date))
2325 (or (and (Math-objectp lo) (not (Math-anglep lo)))
2326 (and (Math-objectp hi) (not (Math-anglep hi)))))
2327 (list 'calcFunc-intv mask lo hi)
2328 (math-make-intv mask lo hi))))
2329 ((eq (car a) 'vec)
2330 (cons 'vec (mapcar 'math-normalize (cdr a))))
2331 ((eq (car a) 'quote)
2332 (math-normalize (nth 1 a)))
2333 ((eq (car a) 'special-const)
2334 (calc-with-default-simplification
2335 (math-normalize (nth 1 a))))
2336 ((eq (car a) 'var)
2337 (cons 'var (cdr a))) ; need to re-cons for selection routines
2338 ((eq (car a) 'calcFunc-if)
2339 (math-normalize-logical-op a))
2340 ((memq (car a) '(calcFunc-lambda calcFunc-quote calcFunc-condition))
2341 (let ((calc-simplify-mode 'none))
2342 (cons (car a) (mapcar 'math-normalize (cdr a)))))
2343 ((eq (car a) 'calcFunc-evalto)
2344 (setq a (or (nth 1 a) 0))
2345 (or calc-refreshing-evaltos
2346 (setq a (let ((calc-simplify-mode 'none)) (math-normalize a))))
2347 (let ((b (if (and (eq (car-safe a) 'calcFunc-assign)
2348 (= (length a) 3))
2349 (nth 2 a)
2350 a)))
2351 (list 'calcFunc-evalto
2352 a
2353 (if (eq calc-simplify-mode 'none)
2354 (math-normalize b)
2355 (calc-with-default-simplification
2356 (math-evaluate-expr b))))))
2357 ((or (integerp (car a)) (consp (car a)))
2358 (if (null (cdr a))
2359 (math-normalize (car a))
2360 (error "Can't use multi-valued function in an expression")))))
2361
2362 ;; The variable math-normalize-a is local to math-normalize in calc.el,
2363 ;; but is used by math-normalize-nonstandard, which is called by
2364 ;; math-normalize.
2365 (defvar math-normalize-a)
2366
2367 (defun math-normalize-nonstandard ()
2368 (if (consp calc-simplify-mode)
2369 (progn
2370 (setq calc-simplify-mode 'none
2371 math-simplify-only (car-safe (cdr-safe math-normalize-a)))
2372 nil)
2373 (and (symbolp (car math-normalize-a))
2374 (or (eq calc-simplify-mode 'none)
2375 (and (eq calc-simplify-mode 'num)
2376 (let ((aptr (setq math-normalize-a
2377 (cons
2378 (car math-normalize-a)
2379 (mapcar 'math-normalize
2380 (cdr math-normalize-a))))))
2381 (while (and aptr (math-constp (car aptr)))
2382 (setq aptr (cdr aptr)))
2383 aptr)))
2384 (cons (car math-normalize-a)
2385 (mapcar 'math-normalize (cdr math-normalize-a))))))
2386
2387
2388 ;;; Normalize a bignum digit list by trimming high-end zeros. [L l]
2389 (defun math-norm-bignum (a)
2390 (let ((digs a) (last nil))
2391 (while digs
2392 (or (eq (car digs) 0) (setq last digs))
2393 (setq digs (cdr digs)))
2394 (and last
2395 (progn
2396 (setcdr last nil)
2397 a))))
2398
2399 (defun math-bignum-test (a) ; [B N; B s; b b]
2400 (if (consp a)
2401 a
2402 (math-bignum a)))
2403
2404
2405 ;;; Return 0 for zero, -1 for negative, 1 for positive. [S n] [Public]
2406 (defun calcFunc-sign (a &optional x)
2407 (let ((signs (math-possible-signs a)))
2408 (cond ((eq signs 4) (or x 1))
2409 ((eq signs 2) 0)
2410 ((eq signs 1) (if x (math-neg x) -1))
2411 ((math-looks-negp a) (math-neg (calcFunc-sign (math-neg a))))
2412 (t (calc-record-why 'realp a)
2413 (if x
2414 (list 'calcFunc-sign a x)
2415 (list 'calcFunc-sign a))))))
2416
2417 ;;; Return 0 if A is numerically equal to B, <0 if less, >0 if more.
2418 ;;; Arguments must be normalized! [S N N]
2419 (defun math-compare (a b)
2420 (cond ((equal a b)
2421 (if (and (consp a)
2422 (memq (car a) '(var neg * /))
2423 (math-infinitep a))
2424 2
2425 0))
2426 ((and (integerp a) (Math-integerp b))
2427 (if (consp b)
2428 (if (eq (car b) 'bigpos) -1 1)
2429 (if (< a b) -1 1)))
2430 ((and (eq (car-safe a) 'bigpos) (Math-integerp b))
2431 (if (eq (car-safe b) 'bigpos)
2432 (math-compare-bignum (cdr a) (cdr b))
2433 1))
2434 ((and (eq (car-safe a) 'bigneg) (Math-integerp b))
2435 (if (eq (car-safe b) 'bigneg)
2436 (math-compare-bignum (cdr b) (cdr a))
2437 -1))
2438 ((eq (car-safe a) 'frac)
2439 (if (eq (car-safe b) 'frac)
2440 (math-compare (math-mul (nth 1 a) (nth 2 b))
2441 (math-mul (nth 1 b) (nth 2 a)))
2442 (math-compare (nth 1 a) (math-mul b (nth 2 a)))))
2443 ((eq (car-safe b) 'frac)
2444 (math-compare (math-mul a (nth 2 b)) (nth 1 b)))
2445 ((and (eq (car-safe a) 'float) (eq (car-safe b) 'float))
2446 (if (math-lessp-float a b) -1 1))
2447 ((and (eq (car-safe a) 'date) (eq (car-safe b) 'date))
2448 (math-compare (nth 1 a) (nth 1 b)))
2449 ((and (or (Math-anglep a)
2450 (and (eq (car a) 'cplx) (eq (nth 2 a) 0)))
2451 (or (Math-anglep b)
2452 (and (eq (car b) 'cplx) (eq (nth 2 b) 0))))
2453 (calcFunc-sign (math-add a (math-neg b))))
2454 ((and (eq (car-safe a) 'intv)
2455 (or (Math-anglep b) (eq (car-safe b) 'date)))
2456 (let ((res (math-compare (nth 2 a) b)))
2457 (cond ((eq res 1) 1)
2458 ((and (eq res 0) (memq (nth 1 a) '(0 1))) 1)
2459 ((eq (setq res (math-compare (nth 3 a) b)) -1) -1)
2460 ((and (eq res 0) (memq (nth 1 a) '(0 2))) -1)
2461 (t 2))))
2462 ((and (eq (car-safe b) 'intv)
2463 (or (Math-anglep a) (eq (car-safe a) 'date)))
2464 (let ((res (math-compare a (nth 2 b))))
2465 (cond ((eq res -1) -1)
2466 ((and (eq res 0) (memq (nth 1 b) '(0 1))) -1)
2467 ((eq (setq res (math-compare a (nth 3 b))) 1) 1)
2468 ((and (eq res 0) (memq (nth 1 b) '(0 2))) 1)
2469 (t 2))))
2470 ((and (eq (car-safe a) 'intv) (eq (car-safe b) 'intv))
2471 (let ((res (math-compare (nth 3 a) (nth 2 b))))
2472 (cond ((eq res -1) -1)
2473 ((and (eq res 0) (or (memq (nth 1 a) '(0 2))
2474 (memq (nth 1 b) '(0 1)))) -1)
2475 ((eq (setq res (math-compare (nth 2 a) (nth 3 b))) 1) 1)
2476 ((and (eq res 0) (or (memq (nth 1 a) '(0 1))
2477 (memq (nth 1 b) '(0 2)))) 1)
2478 (t 2))))
2479 ((math-infinitep a)
2480 (if (or (equal a '(var uinf var-uinf))
2481 (equal a '(var nan var-nan)))
2482 2
2483 (let ((dira (math-infinite-dir a)))
2484 (if (math-infinitep b)
2485 (if (or (equal b '(var uinf var-uinf))
2486 (equal b '(var nan var-nan)))
2487 2
2488 (let ((dirb (math-infinite-dir b)))
2489 (cond ((and (eq dira 1) (eq dirb -1)) 1)
2490 ((and (eq dira -1) (eq dirb 1)) -1)
2491 (t 2))))
2492 (cond ((eq dira 1) 1)
2493 ((eq dira -1) -1)
2494 (t 2))))))
2495 ((math-infinitep b)
2496 (if (or (equal b '(var uinf var-uinf))
2497 (equal b '(var nan var-nan)))
2498 2
2499 (let ((dirb (math-infinite-dir b)))
2500 (cond ((eq dirb 1) -1)
2501 ((eq dirb -1) 1)
2502 (t 2)))))
2503 ((and (eq (car-safe a) 'calcFunc-exp)
2504 (eq (car-safe b) '^)
2505 (equal (nth 1 b) '(var e var-e)))
2506 (math-compare (nth 1 a) (nth 2 b)))
2507 ((and (eq (car-safe b) 'calcFunc-exp)
2508 (eq (car-safe a) '^)
2509 (equal (nth 1 a) '(var e var-e)))
2510 (math-compare (nth 2 a) (nth 1 b)))
2511 ((or (and (eq (car-safe a) 'calcFunc-sqrt)
2512 (eq (car-safe b) '^)
2513 (or (equal (nth 2 b) '(frac 1 2))
2514 (equal (nth 2 b) '(float 5 -1))))
2515 (and (eq (car-safe b) 'calcFunc-sqrt)
2516 (eq (car-safe a) '^)
2517 (or (equal (nth 2 a) '(frac 1 2))
2518 (equal (nth 2 a) '(float 5 -1)))))
2519 (math-compare (nth 1 a) (nth 1 b)))
2520 ((eq (car-safe a) 'var)
2521 2)
2522 (t
2523 (if (and (consp a) (consp b)
2524 (eq (car a) (car b))
2525 (math-compare-lists (cdr a) (cdr b)))
2526 0
2527 2))))
2528
2529 ;;; Compare two bignum digit lists, return -1 for A<B, 0 for A=B, 1 for A>B.
2530 (defun math-compare-bignum (a b) ; [S l l]
2531 (let ((res 0))
2532 (while (and a b)
2533 (if (< (car a) (car b))
2534 (setq res -1)
2535 (if (> (car a) (car b))
2536 (setq res 1)))
2537 (setq a (cdr a)
2538 b (cdr b)))
2539 (if a
2540 (progn
2541 (while (eq (car a) 0) (setq a (cdr a)))
2542 (if a 1 res))
2543 (while (eq (car b) 0) (setq b (cdr b)))
2544 (if b -1 res))))
2545
2546 (defun math-compare-lists (a b)
2547 (cond ((null a) (null b))
2548 ((null b) nil)
2549 (t (and (Math-equal (car a) (car b))
2550 (math-compare-lists (cdr a) (cdr b))))))
2551
2552 (defun math-lessp-float (a b) ; [P F F]
2553 (let ((ediff (- (nth 2 a) (nth 2 b))))
2554 (if (>= ediff 0)
2555 (if (>= ediff (+ calc-internal-prec calc-internal-prec))
2556 (if (eq (nth 1 a) 0)
2557 (Math-integer-posp (nth 1 b))
2558 (Math-integer-negp (nth 1 a)))
2559 (Math-lessp (math-scale-int (nth 1 a) ediff)
2560 (nth 1 b)))
2561 (if (>= (setq ediff (- ediff))
2562 (+ calc-internal-prec calc-internal-prec))
2563 (if (eq (nth 1 b) 0)
2564 (Math-integer-negp (nth 1 a))
2565 (Math-integer-posp (nth 1 b)))
2566 (Math-lessp (nth 1 a)
2567 (math-scale-int (nth 1 b) ediff))))))
2568
2569 ;;; True if A is numerically equal to B. [P N N] [Public]
2570 (defun math-equal (a b)
2571 (= (math-compare a b) 0))
2572
2573 ;;; True if A is numerically less than B. [P R R] [Public]
2574 (defun math-lessp (a b)
2575 (= (math-compare a b) -1))
2576
2577 ;;; True if A is numerically equal to the integer B. [P N S] [Public]
2578 ;;; B must not be a multiple of 10.
2579 (defun math-equal-int (a b)
2580 (or (eq a b)
2581 (and (eq (car-safe a) 'float)
2582 (eq (nth 1 a) b)
2583 (= (nth 2 a) 0))))
2584
2585
2586
2587
2588 ;;; Return the dimensions of a matrix as a list. [l x] [Public]
2589 (defun math-mat-dimens (m)
2590 (if (math-vectorp m)
2591 (if (math-matrixp m)
2592 (cons (1- (length m))
2593 (math-mat-dimens (nth 1 m)))
2594 (list (1- (length m))))
2595 nil))
2596
2597
2598
2599 (defun calc-binary-op-fancy (name func arg ident unary)
2600 (let ((n (prefix-numeric-value arg)))
2601 (cond ((> n 1)
2602 (calc-enter-result n
2603 name
2604 (list 'calcFunc-reduce
2605 (math-calcFunc-to-var func)
2606 (cons 'vec (calc-top-list-n n)))))
2607 ((= n 1)
2608 (if unary
2609 (calc-enter-result 1 name (list unary (calc-top-n 1)))))
2610 ((= n 0)
2611 (if ident
2612 (calc-enter-result 0 name ident)
2613 (error "Argument must be nonzero")))
2614 (t
2615 (let ((rhs (calc-top-n 1)))
2616 (calc-enter-result (- 1 n)
2617 name
2618 (mapcar (function
2619 (lambda (x)
2620 (list func x rhs)))
2621 (calc-top-list-n (- n) 2))))))))
2622
2623 (defun calc-unary-op-fancy (name func arg)
2624 (let ((n (prefix-numeric-value arg)))
2625 (if (= n 0) (setq n (calc-stack-size)))
2626 (cond ((> n 0)
2627 (calc-enter-result n
2628 name
2629 (mapcar (function
2630 (lambda (x)
2631 (list func x)))
2632 (calc-top-list-n n))))
2633 ((< n 0)
2634 (calc-enter-result 1
2635 name
2636 (list func (calc-top-n (- n)))
2637 (- n))))))
2638
2639 (defvar var-Holidays '(vec (var sat var-sat) (var sun var-sun)))
2640 (defvar var-Decls (list 'vec))
2641
2642
2643 (defun math-inexact-result ()
2644 (and calc-symbolic-mode
2645 (signal 'inexact-result nil)))
2646
2647 (defun math-overflow (&optional exp)
2648 (if (and exp (math-negp exp))
2649 (math-underflow)
2650 (signal 'math-overflow nil)))
2651
2652 (defun math-underflow ()
2653 (signal 'math-underflow nil))
2654
2655 ;;; Compute the greatest common divisor of A and B. [I I I] [Public]
2656 (defun math-gcd (a b)
2657 (cond ((not (or (consp a) (consp b)))
2658 (if (< a 0) (setq a (- a)))
2659 (if (< b 0) (setq b (- b)))
2660 (let (c)
2661 (if (< a b)
2662 (setq c b b a a c))
2663 (while (> b 0)
2664 (setq c b
2665 b (% a b)
2666 a c))
2667 a))
2668 ((eq a 0) b)
2669 ((eq b 0) a)
2670 (t
2671 (if (Math-integer-negp a) (setq a (math-neg a)))
2672 (if (Math-integer-negp b) (setq b (math-neg b)))
2673 (let (c)
2674 (if (Math-natnum-lessp a b)
2675 (setq c b b a a c))
2676 (while (and (consp a) (not (eq b 0)))
2677 (setq c b
2678 b (math-imod a b)
2679 a c))
2680 (while (> b 0)
2681 (setq c b
2682 b (% a b)
2683 a c))
2684 a))))
2685
2686
2687 ;;;; Algebra.
2688
2689 ;;; Evaluate variables in an expression.
2690 (defun math-evaluate-expr (x) ; [Public]
2691 (if calc-embedded-info
2692 (calc-embedded-evaluate-expr x)
2693 (calc-normalize (math-evaluate-expr-rec x))))
2694
2695 (defalias 'calcFunc-evalv 'math-evaluate-expr)
2696
2697 (defun calcFunc-evalvn (x &optional prec)
2698 (if prec
2699 (progn
2700 (or (math-num-integerp prec)
2701 (if (and (math-vectorp prec)
2702 (= (length prec) 2)
2703 (math-num-integerp (nth 1 prec)))
2704 (setq prec (math-add (nth 1 prec) calc-internal-prec))
2705 (math-reject-arg prec 'integerp)))
2706 (setq prec (math-trunc prec))
2707 (if (< prec 3) (setq prec 3))
2708 (if (> prec calc-internal-prec)
2709 (math-normalize
2710 (let ((calc-internal-prec prec))
2711 (calcFunc-evalvn x)))
2712 (let ((calc-internal-prec prec))
2713 (calcFunc-evalvn x))))
2714 (let ((calc-symbolic-mode nil))
2715 (math-evaluate-expr x))))
2716
2717 (defun math-evaluate-expr-rec (x)
2718 (if (consp x)
2719 (if (memq (car x) '(calcFunc-quote calcFunc-condition
2720 calcFunc-evalto calcFunc-assign))
2721 (if (and (eq (car x) 'calcFunc-assign)
2722 (= (length x) 3))
2723 (list (car x) (nth 1 x) (math-evaluate-expr-rec (nth 2 x)))
2724 x)
2725 (if (eq (car x) 'var)
2726 (if (and (calc-var-value (nth 2 x))
2727 (not (eq (car-safe (symbol-value (nth 2 x)))
2728 'incomplete)))
2729 (let ((val (symbol-value (nth 2 x))))
2730 (if (eq (car-safe val) 'special-const)
2731 (if calc-symbolic-mode
2732 x
2733 val)
2734 val))
2735 x)
2736 (if (Math-primp x)
2737 x
2738 (cons (car x) (mapcar 'math-evaluate-expr-rec (cdr x))))))
2739 x))
2740
2741 (defun math-any-floats (expr)
2742 (if (Math-primp expr)
2743 (math-floatp expr)
2744 (while (and (setq expr (cdr expr)) (not (math-any-floats (car expr)))))
2745 expr))
2746
2747 (defvar var-FactorRules 'calc-FactorRules)
2748
2749 (defvar math-mt-many nil)
2750 (defvar math-mt-func nil)
2751
2752 (defun math-map-tree (math-mt-func mmt-expr &optional math-mt-many)
2753 (or math-mt-many (setq math-mt-many 1000000))
2754 (math-map-tree-rec mmt-expr))
2755
2756 (defun math-map-tree-rec (mmt-expr)
2757 (or (= math-mt-many 0)
2758 (let ((mmt-done nil)
2759 mmt-nextval)
2760 (while (not mmt-done)
2761 (while (and (/= math-mt-many 0)
2762 (setq mmt-nextval (funcall math-mt-func mmt-expr))
2763 (not (equal mmt-expr mmt-nextval)))
2764 (setq mmt-expr mmt-nextval
2765 math-mt-many (if (> math-mt-many 0)
2766 (1- math-mt-many)
2767 (1+ math-mt-many))))
2768 (if (or (Math-primp mmt-expr)
2769 (<= math-mt-many 0))
2770 (setq mmt-done t)
2771 (setq mmt-nextval (cons (car mmt-expr)
2772 (mapcar 'math-map-tree-rec
2773 (cdr mmt-expr))))
2774 (if (equal mmt-nextval mmt-expr)
2775 (setq mmt-done t)
2776 (setq mmt-expr mmt-nextval))))))
2777 mmt-expr)
2778
2779 (defun math-is-true (expr)
2780 (if (Math-numberp expr)
2781 (not (Math-zerop expr))
2782 (math-known-nonzerop expr)))
2783
2784 (defun math-const-var (expr)
2785 (and (consp expr)
2786 (eq (car expr) 'var)
2787 (or (and (symbolp (nth 2 expr))
2788 (boundp (nth 2 expr))
2789 (eq (car-safe (symbol-value (nth 2 expr))) 'special-const))
2790 (memq (nth 2 expr) '(var-inf var-uinf var-nan)))))
2791
2792 ;; The variable math-integral-cache is originally declared in calcalg2.el,
2793 ;; but is set by math-defintegral and math-definitegral2.
2794 (defvar math-integral-cache)
2795
2796 (defmacro math-defintegral (funcs &rest code)
2797 (setq math-integral-cache nil)
2798 (append '(progn)
2799 (mapcar (function
2800 (lambda (func)
2801 (list 'put (list 'quote func) ''math-integral
2802 (list 'nconc
2803 (list 'get (list 'quote func) ''math-integral)
2804 (list 'list
2805 (list 'function
2806 (append '(lambda (u))
2807 code)))))))
2808 (if (symbolp funcs) (list funcs) funcs))))
2809 (put 'math-defintegral 'lisp-indent-hook 1)
2810
2811 (defmacro math-defintegral-2 (funcs &rest code)
2812 (setq math-integral-cache nil)
2813 (append '(progn)
2814 (mapcar (function
2815 (lambda (func)
2816 (list 'put (list 'quote func) ''math-integral-2
2817 (list 'nconc
2818 (list 'get (list 'quote func)
2819 ''math-integral-2)
2820 (list 'list
2821 (list 'function
2822 (append '(lambda (u v))
2823 code)))))))
2824 (if (symbolp funcs) (list funcs) funcs))))
2825 (put 'math-defintegral-2 'lisp-indent-hook 1)
2826
2827 (defvar var-IntegAfterRules 'calc-IntegAfterRules)
2828
2829 (defvar var-FitRules 'calc-FitRules)
2830
2831 (defvar math-poly-base-variable nil)
2832 (defvar math-poly-neg-powers nil)
2833 (defvar math-poly-mult-powers 1)
2834 (defvar math-poly-frac-powers nil)
2835 (defvar math-poly-exp-base nil)
2836
2837 (defun math-build-var-name (name)
2838 (if (stringp name)
2839 (setq name (intern name)))
2840 (if (string-match "\\`var-." (symbol-name name))
2841 (list 'var (intern (substring (symbol-name name) 4)) name)
2842 (list 'var name (intern (concat "var-" (symbol-name name))))))
2843
2844 (defvar math-simplifying-units nil)
2845 (defvar math-combining-units t)
2846
2847 ;;; Nontrivial number parsing.
2848
2849 (defun math-read-number-fancy (s)
2850 (cond
2851
2852 ;; Integer+fractions
2853 ((string-match "^\\([0-9]*\\)[:/]\\([0-9]*\\)[:/]\\([0-9]*\\)$" s)
2854 (let ((int (math-match-substring s 1))
2855 (num (math-match-substring s 2))
2856 (den (math-match-substring s 3)))
2857 (let ((int (if (> (length int) 0) (math-read-number int) 0))
2858 (num (if (> (length num) 0) (math-read-number num) 1))
2859 (den (if (> (length num) 0) (math-read-number den) 1)))
2860 (and int num den
2861 (math-integerp int) (math-integerp num) (math-integerp den)
2862 (not (math-zerop den))
2863 (list 'frac (math-add num (math-mul int den)) den)))))
2864
2865 ;; Fractions
2866 ((string-match "^\\([0-9]*\\)[:/]\\([0-9]*\\)$" s)
2867 (let ((num (math-match-substring s 1))
2868 (den (math-match-substring s 2)))
2869 (let ((num (if (> (length num) 0) (math-read-number num) 1))
2870 (den (if (> (length num) 0) (math-read-number den) 1)))
2871 (and num den (math-integerp num) (math-integerp den)
2872 (not (math-zerop den))
2873 (list 'frac num den)))))
2874
2875 ;; Modulo forms
2876 ((string-match "^\\(.*\\) *mod *\\(.*\\)$" s)
2877 (let* ((n (math-match-substring s 1))
2878 (m (math-match-substring s 2))
2879 (n (math-read-number n))
2880 (m (math-read-number m)))
2881 (and n m (math-anglep n) (math-anglep m)
2882 (list 'mod n m))))
2883
2884 ;; Error forms
2885 ((string-match "^\\(.*\\) *\\+/- *\\(.*\\)$" s)
2886 (let* ((x (math-match-substring s 1))
2887 (sigma (math-match-substring s 2))
2888 (x (math-read-number x))
2889 (sigma (math-read-number sigma)))
2890 (and x sigma (math-scalarp x) (math-anglep sigma)
2891 (list 'sdev x sigma))))
2892
2893 ;; Hours (or degrees)
2894 ((or (string-match "^\\([^#^]+\\)[@oOhH]\\(.*\\)$" s)
2895 (string-match "^\\([^#^]+\\)[dD][eE]?[gG]?\\(.*\\)$" s))
2896 (let* ((hours (math-match-substring s 1))
2897 (minsec (math-match-substring s 2))
2898 (hours (math-read-number hours))
2899 (minsec (if (> (length minsec) 0) (math-read-number minsec) 0)))
2900 (and hours minsec
2901 (math-num-integerp hours)
2902 (not (math-negp hours)) (not (math-negp minsec))
2903 (cond ((math-num-integerp minsec)
2904 (and (Math-lessp minsec 60)
2905 (list 'hms hours minsec 0)))
2906 ((and (eq (car-safe minsec) 'hms)
2907 (math-zerop (nth 1 minsec)))
2908 (math-add (list 'hms hours 0 0) minsec))
2909 (t nil)))))
2910
2911 ;; Minutes
2912 ((string-match "^\\([^'#^]+\\)[mM']\\(.*\\)$" s)
2913 (let* ((minutes (math-match-substring s 1))
2914 (seconds (math-match-substring s 2))
2915 (minutes (math-read-number minutes))
2916 (seconds (if (> (length seconds) 0) (math-read-number seconds) 0)))
2917 (and minutes seconds
2918 (math-num-integerp minutes)
2919 (not (math-negp minutes)) (not (math-negp seconds))
2920 (cond ((math-realp seconds)
2921 (and (Math-lessp minutes 60)
2922 (list 'hms 0 minutes seconds)))
2923 ((and (eq (car-safe seconds) 'hms)
2924 (math-zerop (nth 1 seconds))
2925 (math-zerop (nth 2 seconds)))
2926 (math-add (list 'hms 0 minutes 0) seconds))
2927 (t nil)))))
2928
2929 ;; Seconds
2930 ((string-match "^\\([^\"#^]+\\)[sS\"]$" s)
2931 (let ((seconds (math-read-number (math-match-substring s 1))))
2932 (and seconds (math-realp seconds)
2933 (not (math-negp seconds))
2934 (Math-lessp seconds 60)
2935 (list 'hms 0 0 seconds))))
2936
2937 ;; Integer+fraction with explicit radix
2938 ((string-match "^\\([0-9]+\\)\\(#\\|\\^\\^\\)\\([0-9a-zA-Z]*\\)[:/]\\([0-9a-zA-Z]*\\)[:/]\\([0-9a-zA-Z]\\)$" s)
2939 (let ((radix (string-to-number (math-match-substring s 1)))
2940 (int (math-match-substring s 3))
2941 (num (math-match-substring s 4))
2942 (den (math-match-substring s 5)))
2943 (let ((int (if (> (length int) 0) (math-read-radix int radix) 0))
2944 (num (if (> (length num) 0) (math-read-radix num radix) 1))
2945 (den (if (> (length den) 0) (math-read-radix den radix) 1)))
2946 (and int num den (not (math-zerop den))
2947 (list 'frac
2948 (math-add num (math-mul int den))
2949 den)))))
2950
2951 ;; Fraction with explicit radix
2952 ((string-match "^\\([0-9]+\\)\\(#\\|\\^\\^\\)\\([0-9a-zA-Z]*\\)[:/]\\([0-9a-zA-Z]*\\)$" s)
2953 (let ((radix (string-to-number (math-match-substring s 1)))
2954 (num (math-match-substring s 3))
2955 (den (math-match-substring s 4)))
2956 (let ((num (if (> (length num) 0) (math-read-radix num radix) 1))
2957 (den (if (> (length den) 0) (math-read-radix den radix) 1)))
2958 (and num den (not (math-zerop den)) (list 'frac num den)))))
2959
2960 ;; Float with explicit radix and exponent
2961 ((or (string-match "^0*\\(\\([2-9]\\|1[0-4]\\)\\(#\\|\\^\\^\\)[0-9a-dA-D.]+\\)[eE]\\([-+]?[0-9]+\\)$" s)
2962 (string-match "^\\(\\([0-9]+\\)\\(#\\|\\^\\^\\)[0-9a-zA-Z.]+\\) *\\* *\\2\\.? *\\^ *\\([-+]?[0-9]+\\)$" s))
2963 (let ((radix (string-to-number (math-match-substring s 2)))
2964 (mant (math-match-substring s 1))
2965 (exp (math-match-substring s 4)))
2966 (let ((mant (math-read-number mant))
2967 (exp (math-read-number exp)))
2968 (and mant exp
2969 (math-mul mant (math-pow (math-float radix) exp))))))
2970
2971 ;; Float with explicit radix, no exponent
2972 ((string-match "^\\([0-9]+\\)\\(#\\|\\^\\^\\)\\([0-9a-zA-Z]*\\)\\.\\([0-9a-zA-Z]*\\)$" s)
2973 (let ((radix (string-to-number (math-match-substring s 1)))
2974 (int (math-match-substring s 3))
2975 (fracs (math-match-substring s 4)))
2976 (let ((int (if (> (length int) 0) (math-read-radix int radix) 0))
2977 (frac (if (> (length fracs) 0) (math-read-radix fracs radix) 0))
2978 (calc-prefer-frac nil))
2979 (and int frac
2980 (math-add int (math-div frac (math-pow radix (length fracs))))))))
2981
2982 ;; Integer with explicit radix
2983 ((string-match "^\\([0-9]+\\)\\(#\\|\\^\\^\\)\\([0-9a-zA-Z]+\\)$" s)
2984 (math-read-radix (math-match-substring s 3)
2985 (string-to-number (math-match-substring s 1))))
2986
2987 ;; C language hexadecimal notation
2988 ((and (eq calc-language 'c)
2989 (string-match "^0[xX]\\([0-9a-fA-F]+\\)$" s))
2990 (let ((digs (math-match-substring s 1)))
2991 (math-read-radix digs 16)))
2992
2993 ;; Pascal language hexadecimal notation
2994 ((and (eq calc-language 'pascal)
2995 (string-match "^\\$\\([0-9a-fA-F]+\\)$" s))
2996 (let ((digs (math-match-substring s 1)))
2997 (math-read-radix digs 16)))
2998
2999 ;; Fraction using "/" instead of ":"
3000 ((string-match "^\\([0-9]+\\)/\\([0-9/]+\\)$" s)
3001 (math-read-number (concat (math-match-substring s 1) ":"
3002 (math-match-substring s 2))))
3003
3004 ;; Syntax error!
3005 (t nil)))
3006
3007 (defun math-read-radix (s r) ; [I X D]
3008 (setq s (upcase s))
3009 (let ((i 0)
3010 (res 0)
3011 dig)
3012 (while (and (< i (length s))
3013 (setq dig (math-read-radix-digit (elt s i)))
3014 (< dig r))
3015 (setq res (math-add (math-mul res r) dig)
3016 i (1+ i)))
3017 (and (= i (length s))
3018 res)))
3019
3020
3021
3022 ;;; Expression parsing.
3023
3024 (defvar math-expr-data)
3025
3026 (defun math-read-expr (math-exp-str)
3027 (let ((math-exp-pos 0)
3028 (math-exp-old-pos 0)
3029 (math-exp-keep-spaces nil)
3030 math-exp-token math-expr-data)
3031 (setq math-exp-str (math-read-preprocess-string math-exp-str))
3032 (while (setq math-exp-token (string-match "\\.\\.\\([^.]\\|.[^.]\\)" math-exp-str))
3033 (setq math-exp-str (concat (substring math-exp-str 0 math-exp-token) "\\dots"
3034 (substring math-exp-str (+ math-exp-token 2)))))
3035 (math-build-parse-table)
3036 (math-read-token)
3037 (let ((val (catch 'syntax (math-read-expr-level 0))))
3038 (if (stringp val)
3039 (list 'error math-exp-old-pos val)
3040 (if (equal math-exp-token 'end)
3041 val
3042 (list 'error math-exp-old-pos "Syntax error"))))))
3043
3044 (defun math-read-plain-expr (exp-str &optional error-check)
3045 (let* ((calc-language nil)
3046 (math-expr-opers (math-standard-ops))
3047 (val (math-read-expr exp-str)))
3048 (and error-check
3049 (eq (car-safe val) 'error)
3050 (error "%s: %s" (nth 2 val) exp-str))
3051 val))
3052
3053
3054 (defun math-read-string ()
3055 (let ((str (read-from-string (concat math-expr-data "\""))))
3056 (or (and (= (cdr str) (1+ (length math-expr-data)))
3057 (stringp (car str)))
3058 (throw 'syntax "Error in string constant"))
3059 (math-read-token)
3060 (append '(vec) (car str) nil)))
3061
3062
3063
3064 ;;; They said it couldn't be done...
3065
3066 (defun math-read-big-expr (str)
3067 (and (> (length calc-left-label) 0)
3068 (string-match (concat "^" (regexp-quote calc-left-label)) str)
3069 (setq str (concat (substring str 0 (match-beginning 0))
3070 (substring str (match-end 0)))))
3071 (and (> (length calc-right-label) 0)
3072 (string-match (concat (regexp-quote calc-right-label) " *$") str)
3073 (setq str (concat (substring str 0 (match-beginning 0))
3074 (substring str (match-end 0)))))
3075 (if (string-match "\\\\[^ \n|]" str)
3076 (if (eq calc-language 'latex)
3077 (math-read-expr str)
3078 (let ((calc-language 'latex)
3079 (calc-language-option nil)
3080 (math-expr-opers (get 'latex 'math-oper-table))
3081 (math-expr-function-mapping (get 'latex 'math-function-table))
3082 (math-expr-variable-mapping (get 'latex 'math-variable-table)))
3083 (math-read-expr str)))
3084 (let ((math-read-big-lines nil)
3085 (pos 0)
3086 (width 0)
3087 (math-read-big-err-msg nil)
3088 math-read-big-baseline math-read-big-h2
3089 new-pos p)
3090 (while (setq new-pos (string-match "\n" str pos))
3091 (setq math-read-big-lines
3092 (cons (substring str pos new-pos) math-read-big-lines)
3093 pos (1+ new-pos)))
3094 (setq math-read-big-lines
3095 (nreverse (cons (substring str pos) math-read-big-lines))
3096 p math-read-big-lines)
3097 (while p
3098 (setq width (max width (length (car p)))
3099 p (cdr p)))
3100 (if (math-read-big-bigp math-read-big-lines)
3101 (or (catch 'syntax
3102 (math-read-big-rec 0 0 width (length math-read-big-lines)))
3103 math-read-big-err-msg
3104 '(error 0 "Syntax error"))
3105 (math-read-expr str)))))
3106
3107 (defun math-read-big-bigp (math-read-big-lines)
3108 (and (cdr math-read-big-lines)
3109 (let ((matrix nil)
3110 (v 0)
3111 (height (if (> (length (car math-read-big-lines)) 0) 1 0)))
3112 (while (and (cdr math-read-big-lines)
3113 (let* ((i 0)
3114 j
3115 (l1 (car math-read-big-lines))
3116 (l2 (nth 1 math-read-big-lines))
3117 (len (min (length l1) (length l2))))
3118 (if (> (length l2) 0)
3119 (setq height (1+ height)))
3120 (while (and (< i len)
3121 (or (memq (aref l1 i) '(?\ ?\- ?\_))
3122 (memq (aref l2 i) '(?\ ?\-))
3123 (and (memq (aref l1 i) '(?\| ?\,))
3124 (= (aref l2 i) (aref l1 i)))
3125 (and (eq (aref l1 i) ?\[)
3126 (eq (aref l2 i) ?\[)
3127 (let ((math-rb-h2 (length l1)))
3128 (setq j (math-read-big-balance
3129 (1+ i) v "[")))
3130 (setq i (1- j)))))
3131 (setq i (1+ i)))
3132 (or (= i len)
3133 (and (eq (aref l1 i) ?\[)
3134 (eq (aref l2 i) ?\[)
3135 (setq matrix t)
3136 nil))))
3137 (setq math-read-big-lines (cdr math-read-big-lines)
3138 v (1+ v)))
3139 (or (and (> height 1)
3140 (not (cdr math-read-big-lines)))
3141 matrix))))
3142
3143 ;;; Nontrivial "flat" formatting.
3144
3145 (defvar math-format-hash-args nil)
3146 (defvar calc-can-abbrev-vectors nil)
3147
3148 (defun math-format-flat-expr-fancy (a prec)
3149 (cond
3150 ((eq (car a) 'incomplete)
3151 (format "<incomplete %s>" (nth 1 a)))
3152 ((eq (car a) 'vec)
3153 (if (or calc-full-trail-vectors (not calc-can-abbrev-vectors)
3154 (< (length a) 7))
3155 (concat "[" (math-format-flat-vector (cdr a) ", "
3156 (if (cdr (cdr a)) 0 1000)) "]")
3157 (concat "["
3158 (math-format-flat-expr (nth 1 a) 0) ", "
3159 (math-format-flat-expr (nth 2 a) 0) ", "
3160 (math-format-flat-expr (nth 3 a) 0) ", ..., "
3161 (math-format-flat-expr (nth (1- (length a)) a) 0) "]")))
3162 ((eq (car a) 'intv)
3163 (concat (if (memq (nth 1 a) '(0 1)) "(" "[")
3164 (math-format-flat-expr (nth 2 a) 1000)
3165 " .. "
3166 (math-format-flat-expr (nth 3 a) 1000)
3167 (if (memq (nth 1 a) '(0 2)) ")" "]")))
3168 ((eq (car a) 'date)
3169 (concat "<" (math-format-date a) ">"))
3170 ((and (eq (car a) 'calcFunc-lambda) (> (length a) 2))
3171 (let ((p (cdr a))
3172 (ap calc-arg-values)
3173 (math-format-hash-args (if (= (length a) 3) 1 t)))
3174 (while (and (cdr p) (equal (car p) (car ap)))
3175 (setq p (cdr p) ap (cdr ap)))
3176 (concat "<"
3177 (if (cdr p)
3178 (concat (math-format-flat-vector
3179 (nreverse (cdr (reverse (cdr a)))) ", " 0)
3180 " : ")
3181 "")
3182 (math-format-flat-expr (nth (1- (length a)) a) 0)
3183 ">")))
3184 ((eq (car a) 'var)
3185 (or (and math-format-hash-args
3186 (let ((p calc-arg-values) (v 1))
3187 (while (and p (not (equal (car p) a)))
3188 (setq p (and (eq math-format-hash-args t) (cdr p))
3189 v (1+ v)))
3190 (and p
3191 (if (eq math-format-hash-args 1)
3192 "#"
3193 (format "#%d" v)))))
3194 (symbol-name (nth 1 a))))
3195 ((and (memq (car a) '(calcFunc-string calcFunc-bstring))
3196 (= (length a) 2)
3197 (math-vectorp (nth 1 a))
3198 (math-vector-is-string (nth 1 a)))
3199 (concat (substring (symbol-name (car a)) 9)
3200 "(" (math-vector-to-string (nth 1 a) t) ")"))
3201 (t
3202 (let ((op (math-assq2 (car a) (math-standard-ops))))
3203 (cond ((and op (= (length a) 3))
3204 (if (> prec (min (nth 2 op) (nth 3 op)))
3205 (concat "(" (math-format-flat-expr a 0) ")")
3206 (let ((lhs (math-format-flat-expr (nth 1 a) (nth 2 op)))
3207 (rhs (math-format-flat-expr (nth 2 a) (nth 3 op))))
3208 (setq op (car op))
3209 (if (or (equal op "^") (equal op "_"))
3210 (if (= (aref lhs 0) ?-)
3211 (setq lhs (concat "(" lhs ")")))
3212 (setq op (concat " " op " ")))
3213 (concat lhs op rhs))))
3214 ((eq (car a) 'neg)
3215 (concat "-" (math-format-flat-expr (nth 1 a) 1000)))
3216 (t
3217 (concat (math-remove-dashes
3218 (if (string-match "\\`calcFunc-\\([a-zA-Z0-9']+\\)\\'"
3219 (symbol-name (car a)))
3220 (math-match-substring (symbol-name (car a)) 1)
3221 (symbol-name (car a))))
3222 "("
3223 (math-format-flat-vector (cdr a) ", " 0)
3224 ")")))))))
3225
3226 (defun math-format-flat-vector (vec sep prec)
3227 (if vec
3228 (let ((buf (math-format-flat-expr (car vec) prec)))
3229 (while (setq vec (cdr vec))
3230 (setq buf (concat buf sep (math-format-flat-expr (car vec) prec))))
3231 buf)
3232 ""))
3233
3234 (defun math-format-nice-expr (x w)
3235 (cond ((and (eq (car-safe x) 'vec)
3236 (cdr (cdr x))
3237 (let ((ops '(vec calcFunc-assign calcFunc-condition
3238 calcFunc-schedule calcFunc-iterations
3239 calcFunc-phase)))
3240 (or (memq (car-safe (nth 1 x)) ops)
3241 (memq (car-safe (nth 2 x)) ops)
3242 (memq (car-safe (nth 3 x)) ops)
3243 calc-break-vectors)))
3244 (concat "[ " (math-format-flat-vector (cdr x) ",\n " 0) " ]"))
3245 (t
3246 (let ((str (math-format-flat-expr x 0))
3247 (pos 0) p)
3248 (or (string-match "\"" str)
3249 (while (<= (setq p (+ pos w)) (length str))
3250 (while (and (> (setq p (1- p)) pos)
3251 (not (= (aref str p) ? ))))
3252 (if (> p (+ pos 5))
3253 (setq str (concat (substring str 0 p)
3254 "\n "
3255 (substring str p))
3256 pos (1+ p))
3257 (setq pos (+ pos w)))))
3258 str))))
3259
3260 (defun math-assq2 (v a)
3261 (while (and a (not (eq v (nth 1 (car a)))))
3262 (setq a (cdr a)))
3263 (car a))
3264
3265 (defun math-format-number-fancy (a prec)
3266 (cond
3267 ((eq (car a) 'float) ; non-decimal radix
3268 (if (Math-integer-negp (nth 1 a))
3269 (concat "-" (math-format-number (math-neg a)))
3270 (let ((str (if (and calc-radix-formatter
3271 (not (memq calc-language '(c pascal))))
3272 (funcall calc-radix-formatter
3273 calc-number-radix
3274 (math-format-radix-float a prec))
3275 (format "%d#%s" calc-number-radix
3276 (math-format-radix-float a prec)))))
3277 (if (and prec (> prec 191) (string-match "\\*" str))
3278 (concat "(" str ")")
3279 str))))
3280 ((eq (car a) 'frac)
3281 (setq a (math-adjust-fraction a))
3282 (if (> (length (car calc-frac-format)) 1)
3283 (if (Math-integer-negp (nth 1 a))
3284 (concat "-" (math-format-number (math-neg a)))
3285 (let ((q (math-idivmod (nth 1 a) (nth 2 a))))
3286 (concat (let ((calc-frac-format nil))
3287 (math-format-number (car q)))
3288 (substring (car calc-frac-format) 0 1)
3289 (let ((math-radix-explicit-format nil)
3290 (calc-frac-format nil))
3291 (math-format-number (cdr q)))
3292 (substring (car calc-frac-format) 1 2)
3293 (let ((math-radix-explicit-format nil)
3294 (calc-frac-format nil))
3295 (math-format-number (nth 2 a))))))
3296 (concat (let ((calc-frac-format nil))
3297 (math-format-number (nth 1 a)))
3298 (car calc-frac-format)
3299 (let ((math-radix-explicit-format nil)
3300 (calc-frac-format nil))
3301 (math-format-number (nth 2 a))))))
3302 ((eq (car a) 'cplx)
3303 (if (math-zerop (nth 2 a))
3304 (math-format-number (nth 1 a))
3305 (if (null calc-complex-format)
3306 (concat "(" (math-format-number (nth 1 a))
3307 ", " (math-format-number (nth 2 a)) ")")
3308 (if (math-zerop (nth 1 a))
3309 (if (math-equal-int (nth 2 a) 1)
3310 (symbol-name calc-complex-format)
3311 (if (math-equal-int (nth 2 a) -1)
3312 (concat "-" (symbol-name calc-complex-format))
3313 (if prec
3314 (math-compose-expr (list '* (nth 2 a) '(cplx 0 1)) prec)
3315 (concat (math-format-number (nth 2 a)) " "
3316 (symbol-name calc-complex-format)))))
3317 (if prec
3318 (math-compose-expr (list (if (math-negp (nth 2 a)) '- '+)
3319 (nth 1 a)
3320 (list 'cplx 0 (math-abs (nth 2 a))))
3321 prec)
3322 (concat (math-format-number (nth 1 a))
3323 (if (math-negp (nth 2 a)) " - " " + ")
3324 (math-format-number
3325 (list 'cplx 0 (math-abs (nth 2 a))))))))))
3326 ((eq (car a) 'polar)
3327 (concat "(" (math-format-number (nth 1 a))
3328 "; " (math-format-number (nth 2 a)) ")"))
3329 ((eq (car a) 'hms)
3330 (if (math-negp a)
3331 (concat "-" (math-format-number (math-neg a)))
3332 (let ((calc-number-radix 10)
3333 (calc-leading-zeros nil)
3334 (calc-group-digits nil))
3335 (format calc-hms-format
3336 (let ((calc-frac-format '(":" nil)))
3337 (math-format-number (nth 1 a)))
3338 (let ((calc-frac-format '(":" nil)))
3339 (math-format-number (nth 2 a)))
3340 (math-format-number (nth 3 a))))))
3341 ((eq (car a) 'intv)
3342 (concat (if (memq (nth 1 a) '(0 1)) "(" "[")
3343 (math-format-number (nth 2 a))
3344 " .. "
3345 (math-format-number (nth 3 a))
3346 (if (memq (nth 1 a) '(0 2)) ")" "]")))
3347 ((eq (car a) 'sdev)
3348 (concat (math-format-number (nth 1 a))
3349 " +/- "
3350 (math-format-number (nth 2 a))))
3351 ((eq (car a) 'vec)
3352 (math-format-flat-expr a 0))
3353 (t (format "%s" a))))
3354
3355 (defun math-adjust-fraction (a)
3356 (if (nth 1 calc-frac-format)
3357 (progn
3358 (if (Math-integerp a) (setq a (list 'frac a 1)))
3359 (let ((g (math-quotient (nth 1 calc-frac-format)
3360 (math-gcd (nth 2 a)
3361 (nth 1 calc-frac-format)))))
3362 (list 'frac (math-mul (nth 1 a) g) (math-mul (nth 2 a) g))))
3363 a))
3364
3365 (defun math-format-bignum-fancy (a) ; [X L]
3366 (let ((str (cond ((= calc-number-radix 10)
3367 (math-format-bignum-decimal a))
3368 ((= calc-number-radix 2)
3369 (math-format-bignum-binary a))
3370 ((= calc-number-radix 8)
3371 (math-format-bignum-octal a))
3372 ((= calc-number-radix 16)
3373 (math-format-bignum-hex a))
3374 (t (math-format-bignum-radix a)))))
3375 (if calc-leading-zeros
3376 (let* ((calc-internal-prec 6)
3377 (digs (math-compute-max-digits (math-abs calc-word-size)
3378 calc-number-radix))
3379 (len (length str)))
3380 (if (< len digs)
3381 (setq str (concat (make-string (- digs len) ?0) str)))))
3382 (if calc-group-digits
3383 (let ((i (length str))
3384 (g (if (integerp calc-group-digits)
3385 (math-abs calc-group-digits)
3386 (if (memq calc-number-radix '(2 16)) 4 3))))
3387 (while (> i g)
3388 (setq i (- i g)
3389 str (concat (substring str 0 i)
3390 calc-group-char
3391 (substring str i))))
3392 str))
3393 (if (and (/= calc-number-radix 10)
3394 math-radix-explicit-format)
3395 (if calc-radix-formatter
3396 (funcall calc-radix-formatter calc-number-radix str)
3397 (format "%d#%s" calc-number-radix str))
3398 str)))
3399
3400
3401 (defun math-group-float (str) ; [X X]
3402 (let* ((pt (or (string-match "[^0-9a-zA-Z]" str) (length str)))
3403 (g (if (integerp calc-group-digits) (math-abs calc-group-digits) 3))
3404 (i pt))
3405 (if (and (integerp calc-group-digits) (< calc-group-digits 0))
3406 (while (< (setq i (+ (1+ i) g)) (length str))
3407 (setq str (concat (substring str 0 i)
3408 calc-group-char
3409 (substring str i))
3410 i (+ i (1- (length calc-group-char))))))
3411 (setq i pt)
3412 (while (> i g)
3413 (setq i (- i g)
3414 str (concat (substring str 0 i)
3415 calc-group-char
3416 (substring str i))))
3417 str))
3418
3419 ;;; Users can redefine this in their .emacs files.
3420 (defvar calc-keypad-user-menu nil
3421 "If non-nil, this describes an additional menu for calc-keypad.
3422 It should contain a list of three rows.
3423 Each row should be a list of six keys.
3424 Each key should be a list of a label string, plus a Calc command name spec.
3425 A command spec is a command name symbol, a keyboard macro string, a
3426 list containing a numeric entry string, or nil.
3427 A key may contain additional specs for Inverse, Hyperbolic, and Inv+Hyp.")
3428
3429 (run-hooks 'calc-ext-load-hook)
3430
3431 (provide 'calc-ext)
3432
3433 ;;; arch-tag: 1814ba7f-a390-49dc-9e25-a5adc205e97e
3434 ;;; calc-ext.el ends here