diff options
Diffstat (limited to 'lisp/calc/calc.el')
| -rw-r--r-- | lisp/calc/calc.el | 201 |
1 files changed, 96 insertions, 105 deletions
diff --git a/lisp/calc/calc.el b/lisp/calc/calc.el index 4ace5fb6780..6480b1960a5 100644 --- a/lisp/calc/calc.el +++ b/lisp/calc/calc.el | |||
| @@ -654,6 +654,20 @@ If nil, selections displayed but ignored.") | |||
| 654 | calc-word-size | 654 | calc-word-size |
| 655 | calc-internal-prec)) | 655 | calc-internal-prec)) |
| 656 | 656 | ||
| 657 | (defvar calc-mode-hook nil | ||
| 658 | "Hook run when entering calc-mode.") | ||
| 659 | |||
| 660 | (defvar calc-trail-mode-hook nil | ||
| 661 | "Hook run when entering calc-trail-mode.") | ||
| 662 | |||
| 663 | (defvar calc-start-hook nil | ||
| 664 | "Hook run when calc is started.") | ||
| 665 | |||
| 666 | (defvar calc-end-hook nil | ||
| 667 | "Hook run when calc is quit.") | ||
| 668 | |||
| 669 | (defvar calc-load-hook nil | ||
| 670 | "Hook run when calc.el is loaded.") | ||
| 657 | 671 | ||
| 658 | ;; Verify that Calc is running on the right kind of system. | 672 | ;; Verify that Calc is running on the right kind of system. |
| 659 | (defvar calc-emacs-type-lucid (not (not (string-match "Lucid" emacs-version)))) | 673 | (defvar calc-emacs-type-lucid (not (not (string-match "Lucid" emacs-version)))) |
| @@ -1056,9 +1070,6 @@ Notations: 3.14e6 3.14 * 10^6 | |||
| 1056 | (progn | 1070 | (progn |
| 1057 | (setq calc-loaded-settings-file t) | 1071 | (setq calc-loaded-settings-file t) |
| 1058 | (load calc-settings-file t))) ; t = missing-ok | 1072 | (load calc-settings-file t))) ; t = missing-ok |
| 1059 | (if (and (eq window-system 'x) (boundp 'mouse-map)) | ||
| 1060 | (substitute-key-definition 'x-paste-text 'calc-x-paste-text | ||
| 1061 | mouse-map)) | ||
| 1062 | (let ((p command-line-args)) | 1073 | (let ((p command-line-args)) |
| 1063 | (while p | 1074 | (while p |
| 1064 | (and (equal (car p) "-f") | 1075 | (and (equal (car p) "-f") |
| @@ -1069,14 +1080,6 @@ Notations: 3.14e6 3.14 * 10^6 | |||
| 1069 | (run-hooks 'calc-mode-hook) | 1080 | (run-hooks 'calc-mode-hook) |
| 1070 | (calc-refresh t) | 1081 | (calc-refresh t) |
| 1071 | (calc-set-mode-line) | 1082 | (calc-set-mode-line) |
| 1072 | ;; The calc-defs variable is a relic. Use calc-define properties instead. | ||
| 1073 | (when (and (boundp 'calc-defs) | ||
| 1074 | calc-defs) | ||
| 1075 | (message "Evaluating calc-defs...") | ||
| 1076 | (calc-need-macros) | ||
| 1077 | (eval (cons 'progn calc-defs)) | ||
| 1078 | (setq calc-defs nil) | ||
| 1079 | (calc-set-mode-line)) | ||
| 1080 | (calc-check-defines)) | 1083 | (calc-check-defines)) |
| 1081 | 1084 | ||
| 1082 | (defvar calc-check-defines 'calc-check-defines) ; suitable for run-hooks | 1085 | (defvar calc-check-defines 'calc-check-defines) ; suitable for run-hooks |
| @@ -1163,20 +1166,18 @@ commands given here will actually operate on the *Calculator* stack." | |||
| 1163 | (switch-to-buffer (current-buffer) t) | 1166 | (switch-to-buffer (current-buffer) t) |
| 1164 | (if (get-buffer-window (current-buffer)) | 1167 | (if (get-buffer-window (current-buffer)) |
| 1165 | (select-window (get-buffer-window (current-buffer))) | 1168 | (select-window (get-buffer-window (current-buffer))) |
| 1166 | (if (and (boundp 'calc-window-hook) calc-window-hook) | 1169 | (let ((w (get-largest-window))) |
| 1167 | (run-hooks 'calc-window-hook) | 1170 | (if (and pop-up-windows |
| 1168 | (let ((w (get-largest-window))) | 1171 | (> (window-height w) |
| 1169 | (if (and pop-up-windows | 1172 | (+ window-min-height calc-window-height 2))) |
| 1170 | (> (window-height w) | 1173 | (progn |
| 1171 | (+ window-min-height calc-window-height 2))) | 1174 | (setq w (split-window w |
| 1172 | (progn | 1175 | (- (window-height w) |
| 1173 | (setq w (split-window w | 1176 | calc-window-height 2) |
| 1174 | (- (window-height w) | 1177 | nil)) |
| 1175 | calc-window-height 2) | 1178 | (set-window-buffer w (current-buffer)) |
| 1176 | nil)) | 1179 | (select-window w)) |
| 1177 | (set-window-buffer w (current-buffer)) | 1180 | (pop-to-buffer (current-buffer)))))) |
| 1178 | (select-window w)) | ||
| 1179 | (pop-to-buffer (current-buffer))))))) | ||
| 1180 | (save-excursion | 1181 | (save-excursion |
| 1181 | (set-buffer (calc-trail-buffer)) | 1182 | (set-buffer (calc-trail-buffer)) |
| 1182 | (and calc-display-trail | 1183 | (and calc-display-trail |
| @@ -1722,27 +1723,6 @@ See calc-keypad for details." | |||
| 1722 | (calc-refresh align))) | 1723 | (calc-refresh align))) |
| 1723 | (setq calc-refresh-count (1+ calc-refresh-count))) | 1724 | (setq calc-refresh-count (1+ calc-refresh-count))) |
| 1724 | 1725 | ||
| 1725 | |||
| 1726 | (defun calc-x-paste-text (arg) | ||
| 1727 | "Move point to mouse position and insert window system cut buffer contents. | ||
| 1728 | If mouse is pressed in Calc window, push cut buffer contents onto the stack." | ||
| 1729 | (x-mouse-select arg) | ||
| 1730 | (if (memq major-mode '(calc-mode calc-trail-mode)) | ||
| 1731 | (progn | ||
| 1732 | (calc-wrapper | ||
| 1733 | (calc-extensions) | ||
| 1734 | (let* ((buf (x-get-cut-buffer)) | ||
| 1735 | (val (math-read-exprs (calc-clean-newlines buf)))) | ||
| 1736 | (if (eq (car-safe val) 'error) | ||
| 1737 | (progn | ||
| 1738 | (setq val (math-read-exprs buf)) | ||
| 1739 | (if (eq (car-safe val) 'error) | ||
| 1740 | (error "%s in yanked data" (nth 2 val))))) | ||
| 1741 | (calc-enter-result 0 "Xynk" val)))) | ||
| 1742 | (x-paste-text arg))) | ||
| 1743 | |||
| 1744 | |||
| 1745 | |||
| 1746 | ;;;; The Calc Trail buffer. | 1726 | ;;;; The Calc Trail buffer. |
| 1747 | 1727 | ||
| 1748 | (defun calc-check-trail-aligned () | 1728 | (defun calc-check-trail-aligned () |
| @@ -1808,10 +1788,8 @@ If mouse is pressed in Calc window, push cut buffer contents onto the stack." | |||
| 1808 | (not (if flag (memq flag '(nil 0)) win))) | 1788 | (not (if flag (memq flag '(nil 0)) win))) |
| 1809 | (if (null win) | 1789 | (if (null win) |
| 1810 | (progn | 1790 | (progn |
| 1811 | (if (and (boundp 'calc-trail-window-hook) calc-trail-window-hook) | 1791 | (let ((w (split-window nil (/ (* (window-width) 2) 3) t))) |
| 1812 | (run-hooks 'calc-trail-window-hook) | 1792 | (set-window-buffer w calc-trail-buffer)) |
| 1813 | (let ((w (split-window nil (/ (* (window-width) 2) 3) t))) | ||
| 1814 | (set-window-buffer w calc-trail-buffer))) | ||
| 1815 | (calc-wrapper | 1793 | (calc-wrapper |
| 1816 | (setq overlay-arrow-string calc-trail-overlay | 1794 | (setq overlay-arrow-string calc-trail-overlay |
| 1817 | overlay-arrow-position calc-trail-pointer) | 1795 | overlay-arrow-position calc-trail-pointer) |
| @@ -2254,62 +2232,72 @@ If mouse is pressed in Calc window, push cut buffer contents onto the stack." | |||
| 2254 | (defvar math-eval-rules-cache) | 2232 | (defvar math-eval-rules-cache) |
| 2255 | (defvar math-eval-rules-cache-other) | 2233 | (defvar math-eval-rules-cache-other) |
| 2256 | ;;; Reduce an object to canonical (normalized) form. [O o; Z Z] [Public] | 2234 | ;;; Reduce an object to canonical (normalized) form. [O o; Z Z] [Public] |
| 2257 | (defun math-normalize (a) | 2235 | |
| 2236 | (defvar math-normalize-a) | ||
| 2237 | (defun math-normalize (math-normalize-a) | ||
| 2258 | (cond | 2238 | (cond |
| 2259 | ((not (consp a)) | 2239 | ((not (consp math-normalize-a)) |
| 2260 | (if (integerp a) | 2240 | (if (integerp math-normalize-a) |
| 2261 | (if (or (>= a 1000000) (<= a -1000000)) | 2241 | (if (or (>= math-normalize-a 1000000) (<= math-normalize-a -1000000)) |
| 2262 | (math-bignum a) | 2242 | (math-bignum math-normalize-a) |
| 2263 | a) | 2243 | math-normalize-a) |
| 2264 | a)) | 2244 | math-normalize-a)) |
| 2265 | ((eq (car a) 'bigpos) | 2245 | ((eq (car math-normalize-a) 'bigpos) |
| 2266 | (if (eq (nth (1- (length a)) a) 0) | 2246 | (if (eq (nth (1- (length math-normalize-a)) math-normalize-a) 0) |
| 2267 | (let* ((last (setq a (copy-sequence a))) (digs a)) | 2247 | (let* ((last (setq math-normalize-a |
| 2248 | (copy-sequence math-normalize-a))) (digs math-normalize-a)) | ||
| 2268 | (while (setq digs (cdr digs)) | 2249 | (while (setq digs (cdr digs)) |
| 2269 | (or (eq (car digs) 0) (setq last digs))) | 2250 | (or (eq (car digs) 0) (setq last digs))) |
| 2270 | (setcdr last nil))) | 2251 | (setcdr last nil))) |
| 2271 | (if (cdr (cdr (cdr a))) | 2252 | (if (cdr (cdr (cdr math-normalize-a))) |
| 2272 | a | 2253 | math-normalize-a |
| 2273 | (cond | 2254 | (cond |
| 2274 | ((cdr (cdr a)) (+ (nth 1 a) (* (nth 2 a) 1000))) | 2255 | ((cdr (cdr math-normalize-a)) (+ (nth 1 math-normalize-a) |
| 2275 | ((cdr a) (nth 1 a)) | 2256 | (* (nth 2 math-normalize-a) 1000))) |
| 2257 | ((cdr math-normalize-a) (nth 1 math-normalize-a)) | ||
| 2276 | (t 0)))) | 2258 | (t 0)))) |
| 2277 | ((eq (car a) 'bigneg) | 2259 | ((eq (car math-normalize-a) 'bigneg) |
| 2278 | (if (eq (nth (1- (length a)) a) 0) | 2260 | (if (eq (nth (1- (length math-normalize-a)) math-normalize-a) 0) |
| 2279 | (let* ((last (setq a (copy-sequence a))) (digs a)) | 2261 | (let* ((last (setq math-normalize-a (copy-sequence math-normalize-a))) |
| 2262 | (digs math-normalize-a)) | ||
| 2280 | (while (setq digs (cdr digs)) | 2263 | (while (setq digs (cdr digs)) |
| 2281 | (or (eq (car digs) 0) (setq last digs))) | 2264 | (or (eq (car digs) 0) (setq last digs))) |
| 2282 | (setcdr last nil))) | 2265 | (setcdr last nil))) |
| 2283 | (if (cdr (cdr (cdr a))) | 2266 | (if (cdr (cdr (cdr math-normalize-a))) |
| 2284 | a | 2267 | math-normalize-a |
| 2285 | (cond | 2268 | (cond |
| 2286 | ((cdr (cdr a)) (- (+ (nth 1 a) (* (nth 2 a) 1000)))) | 2269 | ((cdr (cdr math-normalize-a)) (- (+ (nth 1 math-normalize-a) |
| 2287 | ((cdr a) (- (nth 1 a))) | 2270 | (* (nth 2 math-normalize-a) 1000)))) |
| 2271 | ((cdr math-normalize-a) (- (nth 1 math-normalize-a))) | ||
| 2288 | (t 0)))) | 2272 | (t 0)))) |
| 2289 | ((eq (car a) 'float) | 2273 | ((eq (car math-normalize-a) 'float) |
| 2290 | (math-make-float (math-normalize (nth 1 a)) (nth 2 a))) | 2274 | (math-make-float (math-normalize (nth 1 math-normalize-a)) |
| 2291 | ((or (memq (car a) '(frac cplx polar hms date mod sdev intv vec var quote | 2275 | (nth 2 math-normalize-a))) |
| 2292 | special-const calcFunc-if calcFunc-lambda | 2276 | ((or (memq (car math-normalize-a) |
| 2293 | calcFunc-quote calcFunc-condition | 2277 | '(frac cplx polar hms date mod sdev intv vec var quote |
| 2294 | calcFunc-evalto)) | 2278 | special-const calcFunc-if calcFunc-lambda |
| 2295 | (integerp (car a)) | 2279 | calcFunc-quote calcFunc-condition |
| 2296 | (and (consp (car a)) (not (eq (car (car a)) 'lambda)))) | 2280 | calcFunc-evalto)) |
| 2281 | (integerp (car math-normalize-a)) | ||
| 2282 | (and (consp (car math-normalize-a)) | ||
| 2283 | (not (eq (car (car math-normalize-a)) 'lambda)))) | ||
| 2297 | (calc-extensions) | 2284 | (calc-extensions) |
| 2298 | (math-normalize-fancy a)) | 2285 | (math-normalize-fancy math-normalize-a)) |
| 2299 | (t | 2286 | (t |
| 2300 | (or (and calc-simplify-mode | 2287 | (or (and calc-simplify-mode |
| 2301 | (calc-extensions) | 2288 | (calc-extensions) |
| 2302 | (math-normalize-nonstandard)) | 2289 | (math-normalize-nonstandard)) |
| 2303 | (let ((args (mapcar 'math-normalize (cdr a)))) | 2290 | (let ((args (mapcar 'math-normalize (cdr math-normalize-a)))) |
| 2304 | (or (condition-case err | 2291 | (or (condition-case err |
| 2305 | (let ((func (assq (car a) '( ( + . math-add ) | 2292 | (let ((func |
| 2306 | ( - . math-sub ) | 2293 | (assq (car math-normalize-a) '( ( + . math-add ) |
| 2307 | ( * . math-mul ) | 2294 | ( - . math-sub ) |
| 2308 | ( / . math-div ) | 2295 | ( * . math-mul ) |
| 2309 | ( % . math-mod ) | 2296 | ( / . math-div ) |
| 2310 | ( ^ . math-pow ) | 2297 | ( % . math-mod ) |
| 2311 | ( neg . math-neg ) | 2298 | ( ^ . math-pow ) |
| 2312 | ( | . math-concat ) )))) | 2299 | ( neg . math-neg ) |
| 2300 | ( | . math-concat ) )))) | ||
| 2313 | (or (and var-EvalRules | 2301 | (or (and var-EvalRules |
| 2314 | (progn | 2302 | (progn |
| 2315 | (or (eq var-EvalRules math-eval-rules-cache-tag) | 2303 | (or (eq var-EvalRules math-eval-rules-cache-tag) |
| @@ -2317,51 +2305,54 @@ If mouse is pressed in Calc window, push cut buffer contents onto the stack." | |||
| 2317 | (calc-extensions) | 2305 | (calc-extensions) |
| 2318 | (math-recompile-eval-rules))) | 2306 | (math-recompile-eval-rules))) |
| 2319 | (and (or math-eval-rules-cache-other | 2307 | (and (or math-eval-rules-cache-other |
| 2320 | (assq (car a) math-eval-rules-cache)) | 2308 | (assq (car math-normalize-a) |
| 2309 | math-eval-rules-cache)) | ||
| 2321 | (math-apply-rewrites | 2310 | (math-apply-rewrites |
| 2322 | (cons (car a) args) | 2311 | (cons (car math-normalize-a) args) |
| 2323 | (cdr math-eval-rules-cache) | 2312 | (cdr math-eval-rules-cache) |
| 2324 | nil math-eval-rules-cache)))) | 2313 | nil math-eval-rules-cache)))) |
| 2325 | (if func | 2314 | (if func |
| 2326 | (apply (cdr func) args) | 2315 | (apply (cdr func) args) |
| 2327 | (and (or (consp (car a)) | 2316 | (and (or (consp (car math-normalize-a)) |
| 2328 | (fboundp (car a)) | 2317 | (fboundp (car math-normalize-a)) |
| 2329 | (and (not calc-extensions-loaded) | 2318 | (and (not calc-extensions-loaded) |
| 2330 | (calc-extensions) | 2319 | (calc-extensions) |
| 2331 | (fboundp (car a)))) | 2320 | (fboundp (car math-normalize-a)))) |
| 2332 | (apply (car a) args))))) | 2321 | (apply (car math-normalize-a) args))))) |
| 2333 | (wrong-number-of-arguments | 2322 | (wrong-number-of-arguments |
| 2334 | (calc-record-why "*Wrong number of arguments" | 2323 | (calc-record-why "*Wrong number of arguments" |
| 2335 | (cons (car a) args)) | 2324 | (cons (car math-normalize-a) args)) |
| 2336 | nil) | 2325 | nil) |
| 2337 | (wrong-type-argument | 2326 | (wrong-type-argument |
| 2338 | (or calc-next-why (calc-record-why "Wrong type of argument" | 2327 | (or calc-next-why |
| 2339 | (cons (car a) args))) | 2328 | (calc-record-why "Wrong type of argument" |
| 2329 | (cons (car math-normalize-a) args))) | ||
| 2340 | nil) | 2330 | nil) |
| 2341 | (args-out-of-range | 2331 | (args-out-of-range |
| 2342 | (calc-record-why "*Argument out of range" (cons (car a) args)) | 2332 | (calc-record-why "*Argument out of range" |
| 2333 | (cons (car math-normalize-a) args)) | ||
| 2343 | nil) | 2334 | nil) |
| 2344 | (inexact-result | 2335 | (inexact-result |
| 2345 | (calc-record-why "No exact representation for result" | 2336 | (calc-record-why "No exact representation for result" |
| 2346 | (cons (car a) args)) | 2337 | (cons (car math-normalize-a) args)) |
| 2347 | nil) | 2338 | nil) |
| 2348 | (math-overflow | 2339 | (math-overflow |
| 2349 | (calc-record-why "*Floating-point overflow occurred" | 2340 | (calc-record-why "*Floating-point overflow occurred" |
| 2350 | (cons (car a) args)) | 2341 | (cons (car math-normalize-a) args)) |
| 2351 | nil) | 2342 | nil) |
| 2352 | (math-underflow | 2343 | (math-underflow |
| 2353 | (calc-record-why "*Floating-point underflow occurred" | 2344 | (calc-record-why "*Floating-point underflow occurred" |
| 2354 | (cons (car a) args)) | 2345 | (cons (car math-normalize-a) args)) |
| 2355 | nil) | 2346 | nil) |
| 2356 | (void-variable | 2347 | (void-variable |
| 2357 | (if (eq (nth 1 err) 'var-EvalRules) | 2348 | (if (eq (nth 1 err) 'var-EvalRules) |
| 2358 | (progn | 2349 | (progn |
| 2359 | (setq var-EvalRules nil) | 2350 | (setq var-EvalRules nil) |
| 2360 | (math-normalize (cons (car a) args))) | 2351 | (math-normalize (cons (car math-normalize-a) args))) |
| 2361 | (calc-record-why "*Variable is void" (nth 1 err))))) | 2352 | (calc-record-why "*Variable is void" (nth 1 err))))) |
| 2362 | (if (consp (car a)) | 2353 | (if (consp (car math-normalize-a)) |
| 2363 | (math-dimension-error) | 2354 | (math-dimension-error) |
| 2364 | (cons (car a) args)))))))) | 2355 | (cons (car math-normalize-a) args)))))))) |
| 2365 | 2356 | ||
| 2366 | 2357 | ||
| 2367 | 2358 | ||