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