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