annotate lisp/calculator.el @ 31384:f6cb7dfe5e7c

(vc-cvs-show-log-entry): New function. (vc-cvs-stay-local): Allow it to be a hostname regexp as well. (vc-cvs-remote-p): Renamed to vc-cvs-stay-local-p. Handle hostname regexps. Updated all callers. (vc-cvs-responsible-p): Handle directories as well. (vc-cvs-could-register): New function. (vc-cvs-retrieve-snapshot): Parse "cvs update" output, keep file properties up-to-date. (vc-cvs-checkout): Do the right thing when the workfile does not exist. (vc-cvs-registered): Use new function vc-cvs-parse-entry to do the actual work. (vc-cvs-remote-p): Allow FILE to be a directory, too. (vc-cvs-dir-state): New function. (vc-cvs-dir-state-heuristic): New function, subroutine of the above. (vc-cvs-parse-entry): New function, also to be used in vc-cvs-registered. (vc-cvs-checkout): Slight restructuring to make the control-flow more clear and to avoid running `cvs' twice. (vc-cvs-workfile-version): Removed comment that this is not reached. It is. (vc-cvs-merge): Set state to 'edited after merge. (vc-cvs-merge-news): Set workfile version to nil if not known. (vc-cvs-latest-on-branch-p): Recommented. Candidate for removal. (vc-cvs-checkin): Raise the max-correct status from 0 to 1. Make sure to switch to *vc* before looking for an error message. Use vc-parse-buffer. (vc-cvs-create-snapshot): Swap DIR and NAME. (vc-cvs-retrieve-snapshot): New function (untested). (vc-cvs-stay-local): Default to t. (vc-cvs-remote-p): New function and property. (vc-cvs-state): Stay local only if the above is t. (vc-handle-cvs): Removed. (vc-cvs-registered): Don't check vc-handle-cvs -- it should all be done via vc-handled-backends now. (vc-cvs-header): Escape Id. (vc-cvs-state, vc-cvs-fetch-status): Use with-temp-file. Use the new BUFFER=t argument to vc-do-command. (vc-cvs-print-log, vc-cvs-diff): Insert in the current buffer. (vc-cvs-state): Use vc-do-command instead of vc-simple-command. (vc-cvs-diff): Remove unused and unsupported argument CMP. (vc-cvs-registered): Obey vc-handle-cvs. (vc-cvs-registered): Use with-temp-buffer. Reorder extraction of fields and call to file-attributes because of a temporary bug in rcp.el. (vc-cvs-fetch-status): Use with-current-buffer. Merge in code from vc-cvs-hooks.el. (proto vc-cvs-registered): Require 'vc-cvs instead of 'vc-cvs-hooks. Don't require 'vc anymore. (vc-cvs-responsible-p): Use expand-file-name instead of concat and file-directory-p instead of file-exists-p. (vc-cvs-create-snapshot): New function, replacing vc-cvs-assign-name. (vc-cvs-assign-name): Remove. (vc-cvs-header): New var. Update Copyright. (vc-cvs-diff): Remove unused `backend' variable. (vc-cvs-checkout): Only toggle read-only if the buffer is setup right. (tail): Provide vc-cvs. (vc-cvs-merge-news, vc-cvs-checkout): Removed call to vc-file-clear-masterprops. (vc-cvs-state): Typo. (vc-cvs-merge-news): Return the status code rather than the error msg. (vc-cvs-state): Don't overwrite a non-heuristic state with a heuristic one. (vc-cvs-merge-news): Just use 'edited for the case with conflicts. (vc-cvs-checkin): Do a trivial parse to set the state in case of error. That allows us to get to 'needs-merge even in the stay-local case. There's still no way to detect 'needs-patch in such a setup (or to force an update for that matter). (vc-cvs-logentry-check): Remove, the default works as well. (vc-cvs-print-log, vc-cvs-diff): Run cvs asynchronously. (vc-cvs-stay-local): Renamed from vc-cvs-simple-toggle. Redocumented. (vc-cvs-state): If locality is wanted, use vc-cvs-state-heuristic. (vc-cvs-toggle-read-only): Removed. (for compiler warnings). (vc-cvs-release, vc-cvs-system-release): Remove. (vc-cvs-use-edit, vc-cvs-simple-toggle): New config variables. (vc-cvs-dired-state-info): Use `cvs-state' and slightly different status symbols. (vc-cvs-parse-status, vc-cvs-state): Move from vc-cvs-hooks.el. (vc-cvs-toggle-read-only): First cut at a function to allow a cvs-status-free vc-toggle-read-only. (vc-cvs-merge-news): Move from cvs-merge-news in vc.el. (vc-cvs-checkin): Use vc-recompute-state+vc-state instead of vc-cvs-status. Also set vc-state rather than vc-locking-user. (vc-cvs-checkout): Modify access rights directly if the user requested not to use `cvs edit'. And refresh the mode line. (if workfile' that got lost when the code was extracted from vc.el. And merged the tail with the rest of the code (not possible in the old vc.el where the tail was shared among all backends). And explicitly set the state to 'edited if `writable' is set. (vc-cvs-revert,vc-cvs-checkout): References to `vc-checkout-model' updated to `vc-cvs-update-model'. (vc-cvs-logentry-check): Function added. (vc-cvs-revert,vc-cvs-checkout): Function calls to `vc-checkout-required' updated to `vc-cvs-uses-locking'. (vc-cvs-admin): Added the query-only option as required by the vc.el file. (vc-cvs-annotate-difference): Updated to handle beginning of annotate buffers correctly. Rename `vc-uses-locking' to `vc-checkout-required'. Rename the `locked' state to `reserved'. (vc-cvs-annotate-difference): Handle possible millenium problem (merged from mainline). Split the annotate feature into a BACKEND-specific part and moved the non-BACKEND stuff to vc.el. (vc-cvs-latest-on-branch-p): Function added. (vc-cvs-revert): Merged and adapted "unedit" patch from main line. (vc-cvs-diff): Function added. (vc-cvs-checkout): Function `vc-cvs-checkout' added. Require vc when compiling. (vc-cvs-register-switches): Doc fix. (vc-annotate-color-map, vc-annotate-menu-elements): Fix custom type. (vc-cvs-print-log, vc-cvs-assign-name, vc-cvs-merge) (vc-cvs-check-headers, vc-cvs-steal, vc-cvs-revert, vc-cvs-checkin): New functions (code from vc.el). (vc-annotate-display-default): Fix interactive spec. (vc-annotate-time-span): Doc fix. Moved the annotate functionality from vc.el. (vc-cvs-admin, vc-cvs-fetch-status): Added from vc.el. (vc-cvs-system-release): Renamed from vc-cvs-backend-release. (vc-cvs-release): Moved from vc.el. (vc-cvs-backend-release): New function. (vc-cvs-dired-state-info, vc-cvs-fetch-status): Moved from vc.el and renamed.
author Gerd Moellmann <gerd@gnu.org>
date Mon, 04 Sep 2000 19:48:04 +0000
parents 5f9c434a6e88
children 23166da66d5f
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
27587
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1 ;;; calculator.el --- A simple pocket calculator.
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3 ;; Copyright (C) 1998 by Free Software Foundation, Inc.
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
4
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
5 ;; Author: Eli Barzilay <eli@lambda.cs.cornell.edu>
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
6 ;; Keywords: tools, convenience
27904
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
7 ;; Time-stamp: <2000-02-16 21:07:54 eli>
27587
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
8
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
9 ;; This file is part of GNU Emacs.
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
10
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
11 ;; GNU Emacs is free software; you can redistribute it and/or modify it
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
12 ;; under the terms of the GNU General Public License as published by the
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
13 ;; Free Software Foundation; either version 2, or (at your option) any
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
14 ;; later version.
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
15
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
16 ;; GNU Emacs is distributed in the hope that it will be useful, but
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
17 ;; WITHOUT ANY WARRANTY; without even the implied warranty of
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
18 ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
19 ;; General Public License for more details.
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
20
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
21 ;; You should have received a copy of the GNU General Public License
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
22 ;; along with GNU Emacs; see the file COPYING. If not, write to the
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
23 ;; Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
24 ;; MA 02111-1307, USA.
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
25
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
26 ;;; Commentary:
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
27 ;;
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
28 ;; A simple pocket calculator for Emacs.
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
29 ;; Why touch your mouse to get xcalc (or calc.exe), when you have Emacs?
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
30 ;;
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
31 ;; If this is not part of your Emacs distribution, then simply bind
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
32 ;; `calculator' to a key and make it an autoloaded function, e.g.:
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
33 ;; (autoload 'calculator "calculator"
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
34 ;; "Run the pocket calculator." t)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
35 ;; (global-set-key [(control return)] 'calculator)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
36 ;;
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
37 ;; Written by Eli Barzilay: Maze is Life! eli@cs.cornell.edu
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
38 ;; http://www.cs.cornell.edu/eli
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
39 ;;
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
40 ;; For latest version, check
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
41 ;; http://www.cs.cornell.edu/eli/misc/calculator.el
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
42
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
43
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
44 (eval-and-compile
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
45 (if (fboundp 'defgroup) nil
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
46 (defmacro defgroup (&rest forms) nil)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
47 (defmacro defcustom (s v d &rest r) (list 'defvar s v d))))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
48
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
49 ;;; Customization:
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
50
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
51 (defgroup calculator nil
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
52 "Simple pocket calculator."
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
53 :prefix "calculator"
30889
5f9c434a6e88 (calculator): Add :version.
Dave Love <fx@gnu.org>
parents: 27904
diff changeset
54 :version "21.1"
27587
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
55 :group 'tools
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
56 :group 'convenience)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
57
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
58 (defcustom calculator-electric-mode nil
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
59 "*Run `calculator' electrically, in the echo area.
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
60 Note that if you use electric-mode, you wouldn't be able to use
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
61 conventional help keys."
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
62 :type 'boolean
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
63 :group 'calculator)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
64
27904
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
65 (defcustom calculator-use-menu t
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
66 "*Make `calculator' create a menu.
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
67 Note that this requires easymenu. Must be set before loading."
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
68 :type 'boolean
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
69 :group 'calculator)
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
70
27587
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
71 (defcustom calculator-bind-escape nil
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
72 "*If non-nil, set escape to exit the calculator."
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
73 :type 'boolean
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
74 :group 'calculator)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
75
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
76 (defcustom calculator-unary-style 'postfix
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
77 "*Value is either 'prefix or 'postfix.
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
78 This determines the default behavior of unary operators."
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
79 :type '(choice (const prefix) (const postfix))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
80 :group 'calculator)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
81
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
82 (defcustom calculator-prompt "Calculator=%s> "
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
83 "*The prompt used by the pocket calculator.
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
84 It should contain a \"%s\" somewhere that will indicate the i/o radixes,
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
85 this string will be a two-character string as described in the
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
86 documentation for `calculator-mode'."
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
87 :type 'string
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
88 :group 'calculator)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
89
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
90 (defcustom calculator-epsilon 1e-15
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
91 "*A threshold for results.
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
92 If any result computed in `calculator-funcall' is smaller than this in
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
93 its absolute value, then zero will be returned."
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
94 :type 'number
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
95 :group 'calculator)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
96
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
97 (defcustom calculator-number-format "%1.3f"
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
98 "*The calculator's string used to display normal numbers."
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
99 :type 'string
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
100 :group 'calculator)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
101
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
102 (defcustom calculator-number-exp-ulimit 1e16
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
103 "*The calculator's upper limit for normal numbers."
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
104 :type 'number
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
105 :group 'calculator)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
106
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
107 (defcustom calculator-number-exp-llimit 0.001
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
108 "*The calculator's lower limit for normal numbers."
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
109 :type 'number
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
110 :group 'calculator)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
111
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
112 (defcustom calculator-number-exp-format "%g"
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
113 "*The calculator's string used to display exponential numbers."
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
114 :type 'string
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
115 :group 'calculator)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
116
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
117 (defcustom calculator-show-integers t
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
118 "*Non-nil value means delete all zero digits after the decimal point."
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
119 :type 'boolean
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
120 :group 'calculator)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
121
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
122 (defcustom calculator-2s-complement nil
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
123 "*If non-nil, show negative numbers in 2s complement in radix modes.
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
124 Otherwise show as a negative number."
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
125 :type 'boolean
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
126 :group 'calculator)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
127
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
128 (defcustom calculator-mode-hook nil
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
129 "*List of hook functions run by `calculator-mode'."
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
130 :type 'hook
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
131 :group 'calculator)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
132
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
133 (defcustom calculator-user-registers nil
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
134 "*An association list of user-defined register bindings.
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
135
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
136 Each element in this list is a list of a character and a number that
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
137 will be stored in that character's register.
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
138
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
139 For example, use this to define the golden ratio number:
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
140 (setq calculator-user-registers '((?g . 1.61803398875)))"
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
141 :type '(repeat (cons character number))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
142 :set '(lambda (_ val)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
143 (and (boundp 'calculator-registers)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
144 (setq calculator-registers
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
145 (append val calculator-registers)))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
146 (setq calculator-user-registers val))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
147 :group 'calculator)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
148
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
149 (defcustom calculator-user-operators nil
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
150 "*A list of additional operators.
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
151
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
152 This is a list in the same format as specified in the documentation for
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
153 `calculator-operators', that you can use to bind additional calculator
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
154 operators. It is probably not a good idea to modify this value with
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
155 `customize' since it is too complex...
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
156
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
157 Examples:
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
158
30889
5f9c434a6e88 (calculator): Add :version.
Dave Love <fx@gnu.org>
parents: 27904
diff changeset
159 * A very simple one, adding a postfix \"x-to-y\" conversion keys, using
5f9c434a6e88 (calculator): Add :version.
Dave Love <fx@gnu.org>
parents: 27904
diff changeset
160 t as a prefix key:
27587
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
161
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
162 (setq calculator-user-operators
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
163 '((\"tf\" cl-to-fr (+ 32 (/ (* X 9) 5)) 1)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
164 (\"tc\" fr-to-cl (/ (* (- X 32) 5) 9) 1)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
165 (\"tp\" kg-to-lb (/ X 0.453592) 1)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
166 (\"tk\" lb-to-kg (* X 0.453592) 1)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
167 (\"tF\" mt-to-ft (/ X 0.3048) 1)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
168 (\"tM\" ft-to-mt (* X 0.3048) 1)))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
169
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
170 * Using a function-like form is very simple, X for an argument (Y the
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
171 second in case of a binary operator), TX is a truncated version of X
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
172 and F does a recursive call, Here is a [very inefficient] Fibonacci
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
173 number calculation:
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
174
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
175 (add-to-list 'calculator-user-operators
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
176 '(\"F\" fib (if (<= TX 1)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
177 1
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
178 (+ (F (- TX 1)) (F (- TX 2)))) 0))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
179
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
180 Note that this will be either postfix or prefix, according to
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
181 `calculator-unary-style'."
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
182 :type '(repeat (list string symbol sexp integer integer))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
183 :group 'calculator)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
184
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
185 ;;; Code:
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
186
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
187 (defvar calculator-initial-operators
27904
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
188 '(;; "+"/"-" have keybindings of themselves, not calculator-ops
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
189 ("=" = identity 1 -1)
27587
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
190 (nobind "+" + + 2 4)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
191 (nobind "-" - - 2 4)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
192 (nobind "+" + + -1 9)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
193 (nobind "-" - - -1 9)
27904
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
194 ("(" \( identity -1 -1)
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
195 (")" \) identity +1 10)
27587
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
196 ;; normal keys
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
197 ("|" or (logior TX TY) 2 2)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
198 ("#" xor (logxor TX TY) 2 2)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
199 ("&" and (logand TX TY) 2 3)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
200 ("*" * * 2 5)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
201 ("/" / / 2 5)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
202 ("\\" div (/ TX TY) 2 5)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
203 ("%" rem (% TX TY) 2 5)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
204 ("L" log log 2 6)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
205 ("S" sin (sin DX) x 6)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
206 ("C" cos (cos DX) x 6)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
207 ("T" tan (tan DX) x 6)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
208 ("IS" asin (D (asin X)) x 6)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
209 ("IC" acos (D (acos X)) x 6)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
210 ("IT" atan (D (atan X)) x 6)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
211 ("Q" sqrt sqrt x 7)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
212 ("^" ^ expt 2 7)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
213 ("!" ! calculator-fact x 7)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
214 (";" 1/ (/ 1 X) 1 7)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
215 ("_" - - 1 8)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
216 ("~" ~ (lognot TX) x 8)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
217 (">" repR calculator-repR 1 8)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
218 ("<" repL calculator-repL 1 8)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
219 ("v" avg (/ (apply '+ L) (length L)) 0 8)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
220 ("l" tot (apply '+ L) 0 8)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
221 )
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
222 "A list of initial operators.
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
223
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
224 This is a list in the same format as `calculator-operators'. Whenever
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
225 `calculator' starts, it looks at the value of this variable, and if it
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
226 is not empty, its contents is prepended to `calculator-operators' and
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
227 the appropriate key bindings are made.
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
228
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
229 This variable is then reset to nil. Don't use this if you want to add
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
230 user-defined operators, use `calculator-user-operators' instead.")
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
231
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
232 (defvar calculator-operators nil
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
233 "The calculator operators, each a list with:
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
234
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
235 1. The key that is bound to for this operation (usually a string);
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
236
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
237 2. The displayed symbol for this function;
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
238
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
239 3. The function symbol, or a form that uses the variables `X' and `Y',
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
240 (if it is a binary operator), `TX' and `TY' (truncated integer
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
241 versions), `DX' (converted to radians if degrees mode is on), `D'
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
242 (function for converting radians to degrees if deg mode is on), `L'
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
243 (list of saved values), `F' (function for recursive iteration calls)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
244 and evaluates to the function value - these variables are capital;
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
245
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
246 4. The function's arity, optional, one of: 2=binary, -1=prefix unary,
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
247 +1=postfix unary, 0=a 0-arg operator func, non-number=postfix/prefix
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
248 as determined by `calculator-unary-style' (the default);
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
249
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
250 5. The function's precedence - should be in the range of 1=lowest to
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
251 9=highest (optional, defaults to 1);
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
252
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
253 It it possible have a unary prefix version of a binary operator if it
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
254 comes later in this list. If the list begins with the symbol 'nobind,
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
255 then no key binding will take place - this is only useful for predefined
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
256 keys.
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
257
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
258 Use `calculator-user-operators' to add operators to this list, see its
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
259 documentation for an example.")
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
260
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
261 (defvar calculator-stack nil
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
262 "Stack contents - operations and operands.")
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
263
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
264 (defvar calculator-curnum nil
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
265 "Current number being entered (as a string).")
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
266
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
267 (defvar calculator-stack-display nil
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
268 "Cons of the stack and its string representation.")
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
269
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
270 (defvar calculator-char-radix
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
271 '((?D . nil) (?B . bin) (?O . oct) (?H . hex) (?X . hex))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
272 "A table to convert input characters to corresponding radix symbols.")
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
273
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
274 (defvar calculator-output-radix nil
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
275 "The mode for display, one of: nil (decimal), 'bin, 'oct or 'hex.")
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
276
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
277 (defvar calculator-input-radix nil
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
278 "The mode for input, one of: nil (decimal), 'bin, 'oct or 'hex.")
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
279
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
280 (defvar calculator-deg nil
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
281 "Non-nil if trig functions operate on degrees instead of radians.")
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
282
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
283 (defvar calculator-saved-list nil
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
284 "A list of saved values collected.")
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
285
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
286 (defvar calculator-saved-ptr 0
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
287 "The pointer to the current saved number.")
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
288
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
289 (defvar calculator-add-saved nil
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
290 "Bound to t when a value should be added to the saved-list.")
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
291
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
292 (defvar calculator-display-fragile nil
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
293 "When non-nil, we see something that the next digit should replace.")
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
294
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
295 (defvar calculator-buffer nil
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
296 "The current calculator buffer.")
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
297
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
298 (defvar calculator-last-opXY nil
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
299 "The last binary operation and its arguments.
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
300 Used for repeating operations in calculator-repR/L.")
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
301
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
302 (defvar calculator-registers ; use user-bindings first
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
303 (append calculator-user-registers (list (cons ?e e) (cons ?p pi)))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
304 "The association list of calculator register values.")
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
305
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
306 (defvar calculator-saved-global-map nil
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
307 "Saved global key map.")
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
308
27904
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
309 (defvar calculator-restart-other-mode nil
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
310 "Used to hack restarting with the mode electric mode changed.")
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
311
27587
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
312 (defvar calculator-mode-map nil
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
313 "The calculator key map.")
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
314
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
315 (or calculator-mode-map
27904
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
316 (let ((map (make-sparse-keymap)))
27587
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
317 (suppress-keymap map t)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
318 (define-key map "i" nil)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
319 (define-key map "o" nil)
27904
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
320 (let ((p
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
321 '(("(" "[" "{")
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
322 (")" "]" "}")
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
323 (calculator-op-or-exp "+" "-" [kp-add] [kp-subtract])
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
324 (calculator-digit "0" "1" "2" "3" "4" "5" "6" "7" "8"
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
325 "9" "a" "b" "c" "d" "f"
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
326 [kp-0] [kp-1] [kp-2] [kp-3] [kp-4]
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
327 [kp-5] [kp-6] [kp-7] [kp-8] [kp-9])
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
328 (calculator-op [kp-divide] [kp-multiply])
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
329 (calculator-decimal "." [kp-decimal])
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
330 (calculator-exp "e")
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
331 (calculator-dec/deg-mode "D")
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
332 (calculator-set-register "s")
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
333 (calculator-get-register "g")
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
334 (calculator-radix-mode "H" "X" "O" "B")
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
335 (calculator-radix-input-mode "id" "ih" "ix" "io" "ib"
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
336 "iD" "iH" "iX" "iO" "iB")
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
337 (calculator-radix-output-mode "od" "oh" "ox" "oo" "ob"
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
338 "oD" "oH" "oX" "oO" "oB")
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
339 (calculator-saved-up [up] [?\C-p])
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
340 (calculator-saved-down [down] [?\C-n])
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
341 (calculator-quit "q" [?\C-g])
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
342 ("=" [enter] [linefeed] [kp-enter]
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
343 [?\r] [?\n])
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
344 (calculator-save-on-list " " [space])
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
345 (calculator-clear-saved [?\C-c] [(control delete)])
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
346 (calculator-save-and-quit [(control return)]
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
347 [(control kp-enter)])
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
348 (calculator-paste [insert] [(shift insert)])
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
349 (calculator-clear [delete] [?\C-?] [?\C-d])
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
350 (calculator-help [?h] [??] [f1] [help])
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
351 (calculator-copy [(control insert)])
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
352 (calculator-backspace [backspace])
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
353 )))
27587
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
354 (while p
27904
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
355 ;; reverse the keys so first defs come last - makes the more
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
356 ;; sensible bindings visible in the menu
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
357 (let ((func (car (car p))) (keys (reverse (cdr (car p)))))
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
358 (while keys
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
359 (define-key map (car keys) func)
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
360 (setq keys (cdr keys))))
27587
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
361 (setq p (cdr p))))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
362 (if calculator-bind-escape
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
363 (progn (define-key map [?\e] 'calculator-quit)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
364 (define-key map [escape] 'calculator-quit))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
365 (define-key map [?\e ?\e ?\e] 'calculator-quit))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
366 ;; make C-h work in text-mode
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
367 (or window-system (define-key map [?\C-h] 'calculator-backspace))
27904
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
368 ;; set up a menu
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
369 (if (and calculator-use-menu (not (boundp 'calculator-menu)))
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
370 (let ((radix-selectors
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
371 (mapcar (lambda (x)
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
372 `([,(nth 0 x)
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
373 (calculator-radix-mode ,(nth 2 x))
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
374 :style radio
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
375 :keys ,(nth 2 x)
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
376 :selected
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
377 (and
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
378 (eq calculator-input-radix ',(nth 1 x))
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
379 (eq calculator-output-radix ',(nth 1 x)))]
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
380 [,(concat (nth 0 x) " Input")
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
381 (calculator-radix-input-mode ,(nth 2 x))
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
382 :keys ,(concat "i" (downcase (nth 2 x)))
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
383 :style radio
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
384 :selected
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
385 (eq calculator-input-radix ',(nth 1 x))]
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
386 [,(concat (nth 0 x) " Output")
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
387 (calculator-radix-output-mode ,(nth 2 x))
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
388 :keys ,(concat "o" (downcase (nth 2 x)))
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
389 :style radio
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
390 :selected
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
391 (eq calculator-output-radix ',(nth 1 x))]))
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
392 '(("Decimal" nil "D")
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
393 ("Binary" bin "B")
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
394 ("Octal" oct "O")
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
395 ("Hexadecimal" hex "H"))))
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
396 (op '(lambda (name key)
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
397 `[,name (calculator-op ,key) :keys ,key])))
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
398 (easy-menu-define
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
399 calculator-menu map "Calculator menu."
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
400 `("Calculator"
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
401 ["Help"
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
402 (let ((last-command 'calculator-help)) (calculator-help))
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
403 :keys "?"]
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
404 "---"
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
405 ["Copy" calculator-copy]
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
406 ["Paste" calculator-paste]
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
407 "---"
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
408 ["Electric mode"
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
409 (progn (calculator-quit)
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
410 (setq calculator-restart-other-mode t)
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
411 (run-with-timer 0.1 nil '(lambda () (message nil)))
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
412 ;; the message from the menu will be visible,
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
413 ;; couldn't make it go away...
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
414 (calculator))
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
415 :active (not calculator-electric-mode)]
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
416 ["Normal mode"
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
417 (progn (setq calculator-restart-other-mode t)
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
418 (calculator-quit))
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
419 :active calculator-electric-mode]
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
420 "---"
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
421 ("Functions"
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
422 ,(funcall op "Repeat-right" ">")
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
423 ,(funcall op "Repeat-left" "<")
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
424 "------General------"
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
425 ,(funcall op "Reciprocal" ";")
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
426 ,(funcall op "Log" "L")
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
427 ,(funcall op "Square-root" "Q")
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
428 ,(funcall op "Factorial" "!")
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
429 "------Trigonometric------"
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
430 ,(funcall op "Sinus" "S")
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
431 ,(funcall op "Cosine" "C")
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
432 ,(funcall op "Tangent" "T")
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
433 ,(funcall op "Inv-Sinus" "IS")
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
434 ,(funcall op "Inv-Cosine" "IC")
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
435 ,(funcall op "Inv-Tangent" "IT")
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
436 "------Bitwise------"
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
437 ,(funcall op "Or" "|")
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
438 ,(funcall op "Xor" "#")
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
439 ,(funcall op "And" "&")
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
440 ,(funcall op "Not" "~"))
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
441 ("Saved List"
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
442 ["Eval+Save" calculator-save-on-list]
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
443 ["Prev number" calculator-saved-up]
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
444 ["Next number" calculator-saved-down]
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
445 ["Delete current" calculator-clear
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
446 :active (and calculator-display-fragile
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
447 calculator-saved-list
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
448 (= (car calculator-stack)
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
449 (nth calculator-saved-ptr
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
450 calculator-saved-list)))]
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
451 ["Delete all" calculator-clear-saved]
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
452 "---"
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
453 ,(funcall op "List-total" "l")
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
454 ,(funcall op "List-average" "v"))
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
455 ("Registers"
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
456 ["Get register" calculator-get-register]
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
457 ["Set register" calculator-set-register])
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
458 ("Modes"
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
459 ["Radians"
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
460 (progn
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
461 (and (or calculator-input-radix calculator-output-radix)
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
462 (calculator-radix-mode "D"))
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
463 (and calculator-deg (calculator-dec/deg-mode)))
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
464 :keys "D"
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
465 :style radio
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
466 :selected (not (or calculator-input-radix
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
467 calculator-output-radix
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
468 calculator-deg))]
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
469 ["Degrees"
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
470 (progn
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
471 (and (or calculator-input-radix calculator-output-radix)
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
472 (calculator-radix-mode "D"))
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
473 (or calculator-deg (calculator-dec/deg-mode)))
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
474 :keys "D"
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
475 :style radio
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
476 :selected (and calculator-deg
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
477 (not (or calculator-input-radix
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
478 calculator-output-radix)))]
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
479 "---"
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
480 ,@(mapcar 'car radix-selectors)
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
481 ("Seperate I/O"
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
482 ,@(mapcar (lambda (x) (nth 1 x)) radix-selectors)
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
483 "---"
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
484 ,@(mapcar (lambda (x) (nth 2 x)) radix-selectors)))
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
485 "---"
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
486 ["Copy+Quit" calculator-save-and-quit]
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
487 ["Quit" calculator-quit]))))
27587
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
488 (setq calculator-mode-map map)))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
489
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
490 (defun calculator-mode ()
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
491 "A simple pocket calculator in Emacs.
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
492
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
493 This calculator is used in the same way as other popular calculators
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
494 like xcalc or calc.exe - but using an Emacs interface.
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
495
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
496 Expressions are entered using normal infix notation, parens are used as
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
497 normal. Unary functions are usually postfix, but some depends on the
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
498 value of `calculator-unary-style' (if the style for an operator below is
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
499 specified, then it is fixed, otherwise it depends on this variable).
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
500 `+' and `-' can be used as either binary operators or prefix unary
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
501 operators. Numbers can be entered with exponential notation using `e',
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
502 except when using a non-decimal radix mode for input (in this case `e'
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
503 will be the hexadecimal digit).
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
504
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
505 Here are the editing keys:
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
506 * `RET' `=' evaluate the current expression
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
507 * `C-insert' copy the whole current expression to the `kill-ring'
27904
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
508 * `C-return' evaluate, save result the `kill-ring' and exit
27587
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
509 * `insert' paste a number if the one was copied (normally)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
510 * `delete' `C-d' clear last argument or whole expression (hit twice)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
511 * `backspace' delete a digit or a previous expression element
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
512 * `h' `?' pop-up a quick reference help
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
513 * `ESC' `q' exit (`ESC' can be used if `calculator-bind-escape' is
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
514 non-nil, otherwise use three consecutive `ESC's)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
515
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
516 These operators are pre-defined:
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
517 * `+' `-' `*' `/' the common binary operators
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
518 * `\\' `%' integer division and reminder
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
519 * `_' `;' postfix unary negation and reciprocal
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
520 * `^' `L' binary operators for x^y and log(x) in base y
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
521 * `Q' `!' unary square root and factorial
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
522 * `S' `C' `T' unary trigonometric operators - sin, cos and tan
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
523 * `|' `#' `&' `~' bitwise operators - or, xor, and, not
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
524
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
525 The trigonometric functions can be inverted if prefixed with an `I', see
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
526 below for the way to use degrees instead of the default radians.
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
527
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
528 Two special postfix unary operators are `>' and `<': whenever a binary
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
529 operator is performed, it is remembered along with its arguments; then
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
530 `>' (`<') will apply the same operator with the same right (left)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
531 argument.
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
532
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
533 hex/oct/bin modes can be set for input and for display separately.
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
534 Another toggle-able mode is for using degrees instead of radians for
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
535 trigonometric functions.
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
536 The keys to switch modes are (`X' is shortcut for `H'):
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
537 * `D' switch to all-decimal mode, or toggle degrees/radians
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
538 * `B' `O' `H' `X' binary/octal/hexadecimal modes for input & display
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
539 * `i' `o' followed by one of `D' `B' `O' `H' `X' (case
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
540 insensitive) sets only the input or display radix mode
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
541 The prompt indicates the current modes:
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
542 * \"D=\": degrees mode;
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
543 * \"?=\": (? is B/O/H) this is the radix for both input and output;
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
544 * \"=?\": (? is B/O/H) the display radix (when input is decimal);
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
545 * \"??\": (? is D/B/O/H) 1st char for input radix, 2nd for display.
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
546
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
547 Values can be saved for future reference in either a list of saved
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
548 values, or in registers.
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
549
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
550 The list of saved values is useful for statistics operations on some
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
551 collected data. It is possible to navigate in this list, and if the
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
552 value shown is the current one on the list, an indication is displayed
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
553 as \"[N]\" if this is the last number and there are N numbers, or
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
554 \"[M/N]\" if the M-th value is shown.
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
555 * `SPC' evaluate the current value as usual, but also adds
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
556 the result to the list of saved values
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
557 * `l' `v' computes total / average of saved values
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
558 * `up' `C-p' browse to the previous value in the list
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
559 * `down' `C-n' browse to the next value in the list
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
560 * `delete' `C-d' remove current value from the list (if it is on it)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
561 * `C-delete' `C-c' delete the whole list
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
562
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
563 Registers are variable-like place-holders for values:
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
564 * `s' followed by a character attach the current value to that character
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
565 * `g' followed by a character fetches the attached value
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
566
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
567 There are many variables that can be used to customize the calculator.
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
568 Some interesting customization variables are:
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
569 * `calculator-electric-mode' use only the echo-area electrically.
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
570 * `calculator-unary-style' set most unary ops to pre/postfix style.
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
571 * `calculator-user-registers' to define user-preset registers.
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
572 * `calculator-user-operators' to add user-defined operators.
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
573 See the documentation for these variables, and \"calculator.el\" for
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
574 more information.
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
575
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
576 \\{calculator-mode-map}"
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
577 (interactive)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
578 (kill-all-local-variables)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
579 (setq major-mode 'calculator-mode)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
580 (setq mode-name "Calculator")
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
581 (use-local-map calculator-mode-map)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
582 (run-hooks 'calculator-mode-hook))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
583
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
584 ;;;###autoload
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
585 (defun calculator ()
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
586 "Run the pocket calculator.
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
587 See the documentation for `calculator-mode' for more information."
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
588 (interactive)
27904
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
589 (if calculator-restart-other-mode
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
590 (setq calculator-electric-mode (not calculator-electric-mode)))
27587
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
591 (if calculator-initial-operators
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
592 (progn (calculator-add-operators calculator-initial-operators)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
593 (setq calculator-initial-operators nil)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
594 ;; don't change this since it is a customization variable,
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
595 ;; its set function will add any new operators.
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
596 (calculator-add-operators calculator-user-operators)))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
597 (if calculator-electric-mode
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
598 (save-window-excursion
27904
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
599 (progn (require 'electric) (message nil)) ; hide load message
27587
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
600 (let (old-g-map old-l-map (echo-keystrokes 0)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
601 (garbage-collection-messages nil)) ; no gc msg when electric
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
602 ;; strange behavior in FSF: doesn't always select correct
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
603 ;; minibuffer. I have no idea how to fix this
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
604 (setq calculator-buffer (window-buffer (minibuffer-window)))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
605 (select-window (minibuffer-window))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
606 (calculator-reset)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
607 (calculator-update-display)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
608 (setq old-l-map (current-local-map))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
609 (setq old-g-map (current-global-map))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
610 (setq calculator-saved-global-map (current-global-map))
27904
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
611 (use-local-map nil)
27587
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
612 (use-global-map calculator-mode-map)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
613 (unwind-protect
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
614 (catch 'calculator-done
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
615 (Electric-command-loop
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
616 'calculator-done
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
617 ;; can't use 'noprompt, bug in electric.el
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
618 '(lambda () 'noprompt)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
619 nil
27904
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
620 (lambda (x y) (calculator-update-display))))
27587
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
621 (and calculator-buffer
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
622 (catch 'calculator-done (calculator-quit)))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
623 (use-local-map old-l-map)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
624 (use-global-map old-g-map))))
27904
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
625 (progn
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
626 (setq calculator-buffer
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
627 (or (and (bufferp calculator-buffer)
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
628 (buffer-live-p calculator-buffer)
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
629 calculator-buffer)
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
630 (if calculator-electric-mode
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
631 (get-buffer-create "*calculator*")
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
632 (let ((split-window-keep-point nil)
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
633 (window-min-height 2))
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
634 (select-window
30889
5f9c434a6e88 (calculator): Add :version.
Dave Love <fx@gnu.org>
parents: 27904
diff changeset
635 ;; Maybe leave two lines for our window because
5f9c434a6e88 (calculator): Add :version.
Dave Love <fx@gnu.org>
parents: 27904
diff changeset
636 ;; of the normal `raised' modeline in Emacs 21.
5f9c434a6e88 (calculator): Add :version.
Dave Love <fx@gnu.org>
parents: 27904
diff changeset
637 (split-window-vertically
5f9c434a6e88 (calculator): Add :version.
Dave Love <fx@gnu.org>
parents: 27904
diff changeset
638 (- (window-height)
5f9c434a6e88 (calculator): Add :version.
Dave Love <fx@gnu.org>
parents: 27904
diff changeset
639 (if (plist-get (face-attr-construct 'modeline)
5f9c434a6e88 (calculator): Add :version.
Dave Love <fx@gnu.org>
parents: 27904
diff changeset
640 :box)
5f9c434a6e88 (calculator): Add :version.
Dave Love <fx@gnu.org>
parents: 27904
diff changeset
641 3
5f9c434a6e88 (calculator): Add :version.
Dave Love <fx@gnu.org>
parents: 27904
diff changeset
642 2))))
27904
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
643 (switch-to-buffer
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
644 (get-buffer-create "*calculator*"))))))
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
645 (set-buffer calculator-buffer)
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
646 (calculator-mode)
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
647 (setq buffer-read-only t)
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
648 (calculator-reset)
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
649 (message "Hit `?' For a quick help screen.")))
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
650 (if (and calculator-restart-other-mode calculator-electric-mode)
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
651 (calculator)))
27587
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
652
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
653 (defun calculator-op-arity (op)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
654 "Return OP's arity, 2, +1 or -1."
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
655 (let ((arity (or (nth 3 op) 'x)))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
656 (if (numberp arity)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
657 arity
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
658 (if (eq calculator-unary-style 'postfix) +1 -1))))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
659
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
660 (defun calculator-op-prec (op)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
661 "Return OP's precedence for reducing when inserting into the stack.
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
662 Defaults to 1."
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
663 (or (nth 4 op) 1))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
664
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
665 (defun calculator-add-operators (more-ops)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
666 "This function handles operator addition.
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
667 Adds MORE-OPS to `calculator-operator', called initially to handle
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
668 `calculator-initial-operators' and `calculator-user-operators'."
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
669 (let ((added-ops nil))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
670 (while more-ops
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
671 (or (eq (car (car more-ops)) 'nobind)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
672 (let ((i -1) (key (car (car more-ops))))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
673 ;; make sure the key is undefined, so it's easy to define
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
674 ;; prefix keys
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
675 (while (< (setq i (1+ i)) (length key))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
676 (or (keymapp
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
677 (lookup-key calculator-mode-map
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
678 (substring key 0 (1+ i))))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
679 (progn
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
680 (define-key
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
681 calculator-mode-map (substring key 0 (1+ i)) nil)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
682 (setq i (length key)))))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
683 (define-key calculator-mode-map key 'calculator-op)))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
684 (setq added-ops (cons (if (eq (car (car more-ops)) 'nobind)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
685 (cdr (car more-ops))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
686 (car more-ops))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
687 added-ops))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
688 (setq more-ops (cdr more-ops)))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
689 ;; added-ops come first, but in correct order
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
690 (setq calculator-operators
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
691 (append (nreverse added-ops) calculator-operators))))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
692
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
693 (defun calculator-reset ()
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
694 "Reset calculator variables."
27904
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
695 (or calculator-restart-other-mode
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
696 (setq calculator-stack nil
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
697 calculator-curnum nil
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
698 calculator-stack-display nil
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
699 calculator-display-fragile nil))
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
700 (setq calculator-restart-other-mode nil)
27587
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
701 (calculator-update-display))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
702
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
703 (defun calculator-get-prompt ()
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
704 "Return a string to display.
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
705 The string is set not to exceed the screen width."
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
706 (let* ((calculator-prompt
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
707 (format calculator-prompt
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
708 (cond
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
709 ((or calculator-output-radix calculator-input-radix)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
710 (if (eq calculator-output-radix
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
711 calculator-input-radix)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
712 (concat
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
713 (char-to-string
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
714 (car (rassq calculator-output-radix
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
715 calculator-char-radix)))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
716 "=")
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
717 (concat
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
718 (if calculator-input-radix
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
719 (char-to-string
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
720 (car (rassq calculator-input-radix
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
721 calculator-char-radix)))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
722 "=")
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
723 (char-to-string
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
724 (car (rassq calculator-output-radix
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
725 calculator-char-radix))))))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
726 (calculator-deg "D=")
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
727 (t "=="))))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
728 (prompt
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
729 (concat calculator-prompt
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
730 (cdr calculator-stack-display)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
731 (cond (calculator-curnum
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
732 ;; number being typed
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
733 (concat calculator-curnum "_"))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
734 ((and (= 1 (length calculator-stack))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
735 calculator-display-fragile)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
736 ;; only the result is shown, next number will
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
737 ;; restart
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
738 nil)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
739 (t
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
740 ;; waiting for a number or an operator
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
741 "?"))))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
742 (trim (- (length prompt) (1- (window-width)))))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
743 (if (<= trim 0)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
744 prompt
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
745 (concat calculator-prompt
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
746 (substring prompt (+ trim (length calculator-prompt)))))))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
747
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
748 (defun calculator-curnum-value ()
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
749 "Get the numeric value of the displayed number string as a float."
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
750 (if calculator-input-radix
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
751 (let ((radix
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
752 (cdr (assq calculator-input-radix
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
753 '((bin . 2) (oct . 8) (hex . 16)))))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
754 (i -1) (value 0))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
755 ;; assume valid input (upcased & characters in range)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
756 (while (< (setq i (1+ i)) (length calculator-curnum))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
757 (setq value
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
758 (+ (let ((ch (aref calculator-curnum i)))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
759 (- ch (if (<= ch ?9) ?0 (- ?A 10))))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
760 (* radix value))))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
761 value)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
762 (car
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
763 (read-from-string
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
764 (cond
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
765 ((equal "." calculator-curnum)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
766 "0.0")
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
767 ((string-match "[eE][+-]?$" calculator-curnum)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
768 (concat calculator-curnum "0"))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
769 ((string-match "\\.[0-9]\\|[eE]" calculator-curnum)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
770 calculator-curnum)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
771 ((string-match "\\." calculator-curnum)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
772 ;; do this because Emacs reads "23." as an integer.
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
773 (concat calculator-curnum "0"))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
774 ((stringp calculator-curnum)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
775 (concat calculator-curnum ".0"))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
776 (t "0.0"))))))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
777
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
778 (defun calculator-num-to-string (num)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
779 "Convert NUM to a displayable string."
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
780 (cond
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
781 ((and (numberp num) calculator-output-radix)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
782 ;; print with radix - for binary I convert the octal number
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
783 (let ((str (format (if (eq calculator-output-radix 'hex) "%x" "%o")
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
784 (calculator-truncate
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
785 (if calculator-2s-complement num (abs num))))))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
786 (if (eq calculator-output-radix 'bin)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
787 (let ((i -1) (s ""))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
788 (while (< (setq i (1+ i)) (length str))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
789 (setq s
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
790 (concat s
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
791 (cdr (assq (aref str i)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
792 '((?0 . "000") (?1 . "001")
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
793 (?2 . "010") (?3 . "011")
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
794 (?4 . "100") (?5 . "101")
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
795 (?6 . "110") (?7 . "111")))))))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
796 (string-match "^0*\\(.+\\)" s)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
797 (setq str (match-string 1 s))))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
798 (upcase
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
799 (if (and (not calculator-2s-complement) (< num 0))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
800 (concat "-" str)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
801 str))))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
802 ((and (numberp num)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
803 ;; is this a normal-range number?
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
804 (>= (abs num) calculator-number-exp-llimit)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
805 (< (abs num) calculator-number-exp-ulimit))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
806 (let ((str (format calculator-number-format num)))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
807 (cond
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
808 ((and calculator-show-integers (string-match "\\.?0+$" str))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
809 ;; remove all redundant zeros
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
810 (substring str 0 (match-beginning 0)))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
811 ((and (not calculator-show-integers)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
812 (string-match "\\..\\(.*[^0]\\)?\\(0+\\)$" str))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
813 ;; remove zeros, except for first after the "."
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
814 (substring str 0 (match-beginning 2)))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
815 (t str))))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
816 ((numberp num) (format calculator-number-exp-format num))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
817 (t (prin1-to-string (nth 1 num) t))))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
818
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
819 (defun calculator-update-display (&optional force)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
820 "Update the display.
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
821 If optional argument FORCE is non-nil, don't use the cached string."
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
822 (set-buffer calculator-buffer)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
823 ;; update calculator-stack-display
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
824 (if (or force
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
825 (not (eq (car calculator-stack-display) calculator-stack)))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
826 (setq calculator-stack-display
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
827 (cons calculator-stack
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
828 (if calculator-stack
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
829 (concat
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
830 (mapconcat 'calculator-num-to-string
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
831 (reverse calculator-stack)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
832 " ")
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
833 " "
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
834 (and calculator-display-fragile
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
835 calculator-saved-list
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
836 (= (car calculator-stack)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
837 (nth calculator-saved-ptr
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
838 calculator-saved-list))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
839 (if (= 0 calculator-saved-ptr)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
840 (format "[%s]" (length calculator-saved-list))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
841 (format "[%s/%s]"
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
842 (- (length calculator-saved-list)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
843 calculator-saved-ptr)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
844 (length calculator-saved-list)))))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
845 ""))))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
846 (let ((inhibit-read-only t))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
847 (erase-buffer)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
848 (insert (calculator-get-prompt)))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
849 (set-buffer-modified-p nil)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
850 (if calculator-display-fragile
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
851 (goto-char (1+ (length calculator-prompt)))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
852 (goto-char (1- (point)))))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
853
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
854 (defun calculator-reduce-stack (prec)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
855 "Reduce the stack using top operator.
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
856 PREC is a precedence - reduce everything with higher precedence."
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
857 (while
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
858 (cond
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
859 ((and (cdr (cdr calculator-stack)) ; have three values
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
860 (consp (nth 0 calculator-stack)) ; two operators & num
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
861 (numberp (nth 1 calculator-stack))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
862 (consp (nth 2 calculator-stack))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
863 (eq '\) (nth 1 (nth 0 calculator-stack)))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
864 (eq '\( (nth 1 (nth 2 calculator-stack))))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
865 ;; reduce "... ( x )" --> "... x"
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
866 (setq calculator-stack
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
867 (cons (nth 1 calculator-stack)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
868 (nthcdr 3 calculator-stack)))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
869 ;; another iteration
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
870 t)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
871 ((and (cdr (cdr calculator-stack)) ; have three values
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
872 (numberp (nth 0 calculator-stack)) ; two nums & operator
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
873 (consp (nth 1 calculator-stack))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
874 (numberp (nth 2 calculator-stack))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
875 (= 2 (calculator-op-arity ; binary operator
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
876 (nth 1 calculator-stack)))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
877 (<= prec ; with higher prec.
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
878 (calculator-op-prec (nth 1 calculator-stack))))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
879 ;; reduce "... x op y" --> "... r", r is the result
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
880 (setq calculator-stack
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
881 (cons (calculator-funcall
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
882 (nth 2 (nth 1 calculator-stack))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
883 (nth 2 calculator-stack)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
884 (nth 0 calculator-stack))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
885 (nthcdr 3 calculator-stack)))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
886 ;; another iteration
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
887 t)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
888 ((and (>= (length calculator-stack) 2) ; have two values
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
889 (numberp (nth 0 calculator-stack)) ; number & operator
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
890 (consp (nth 1 calculator-stack))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
891 (= -1 (calculator-op-arity ; prefix-unary op
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
892 (nth 1 calculator-stack)))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
893 (<= prec ; with higher prec.
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
894 (calculator-op-prec (nth 1 calculator-stack))))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
895 ;; reduce "... op x" --> "... r" for prefix op
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
896 (setq calculator-stack
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
897 (cons (calculator-funcall
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
898 (nth 2 (nth 1 calculator-stack))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
899 (nth 0 calculator-stack))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
900 (nthcdr 2 calculator-stack)))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
901 ;; another iteration
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
902 t)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
903 ((and (cdr calculator-stack) ; have two values
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
904 (consp (nth 0 calculator-stack)) ; operator & number
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
905 (numberp (nth 1 calculator-stack))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
906 (= +1 (calculator-op-arity ; postfix-unary op
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
907 (nth 0 calculator-stack)))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
908 (<= prec ; with higher prec.
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
909 (calculator-op-prec (nth 0 calculator-stack))))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
910 ;; reduce "... x op" --> "... r" for postfix op
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
911 (setq calculator-stack
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
912 (cons (calculator-funcall
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
913 (nth 2 (nth 0 calculator-stack))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
914 (nth 1 calculator-stack))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
915 (nthcdr 2 calculator-stack)))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
916 ;; another iteration
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
917 t)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
918 ((and calculator-stack ; have one value
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
919 (consp (nth 0 calculator-stack)) ; an operator
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
920 (= 0 (calculator-op-arity ; 0-ary op
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
921 (nth 0 calculator-stack))))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
922 ;; reduce "... op" --> "... r" for 0-ary op
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
923 (setq calculator-stack
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
924 (cons (calculator-funcall
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
925 (nth 2 (nth 0 calculator-stack)))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
926 (nthcdr 1 calculator-stack)))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
927 ;; another iteration
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
928 t)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
929 ((and (cdr calculator-stack) ; have two values
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
930 (numberp (nth 0 calculator-stack)) ; both numbers
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
931 (numberp (nth 1 calculator-stack)))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
932 ;; get rid of redundant numbers:
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
933 ;; reduce "... y x" --> "... x"
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
934 ;; needed for 0-ary ops that puts more values
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
935 (setcdr calculator-stack (cdr (cdr calculator-stack))))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
936 (t ;; no more iterations
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
937 nil))))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
938
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
939 (eval-when-compile ; silence the compiler
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
940 (or (fboundp 'event-key)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
941 (defun event-key (&rest _) nil))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
942 (or (fboundp 'key-press-event-p)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
943 (defun key-press-event-p (&rest _) nil)))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
944
27904
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
945 (defun calculator-last-input (&optional keys)
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
946 "Last char (or event or event sequence) that was read.
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
947 Optional string argument KEYS will force using it as the keys entered."
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
948 (let ((inp (or keys (this-command-keys))))
27587
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
949 (if (or (stringp inp) (not (arrayp inp)))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
950 inp
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
951 ;; this translates kp-x to x and [tries to] create a string to
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
952 ;; lookup operators
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
953 (let* ((i -1) (converted-str (make-string (length inp) ? )) k)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
954 ;; converts an array to a string the ops lookup with keypad
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
955 ;; input
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
956 (while (< (setq i (1+ i)) (length inp))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
957 (setq k (aref inp i))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
958 ;; if Emacs will someday have a event-key, then this would
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
959 ;; probably be modified anyway
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
960 (and (fboundp 'event-key) (key-press-event-p k)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
961 (setq k (event-key k)))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
962 ;; assume all symbols are translatable with an ascii-character
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
963 (and (symbolp k)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
964 (setq k (or (get k 'ascii-character) ? )))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
965 (aset converted-str i k))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
966 converted-str))))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
967
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
968 (defun calculator-clear-fragile (&optional op)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
969 "Clear the fragile flag if it was set, then maybe reset all.
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
970 OP is the operator (if any) that caused this call."
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
971 (if (and calculator-display-fragile
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
972 (or (not op)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
973 (= -1 (calculator-op-arity op))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
974 (= 0 (calculator-op-arity op))))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
975 ;; reset if last calc finished, and now get a num or prefix or 0-ary
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
976 ;; op.
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
977 (calculator-reset))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
978 (setq calculator-display-fragile nil))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
979
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
980 (defun calculator-digit ()
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
981 "Enter a single digit."
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
982 (interactive)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
983 (let ((inp (aref (calculator-last-input) 0)))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
984 (if (and (or calculator-display-fragile
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
985 (not (numberp (car calculator-stack))))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
986 (cond
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
987 ((not calculator-input-radix) (<= inp ?9))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
988 ((eq calculator-input-radix 'bin) (<= inp ?1))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
989 ((eq calculator-input-radix 'oct) (<= inp ?7))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
990 (t t)))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
991 ;; enter digit if starting a new computation or have an op on the
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
992 ;; stack.
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
993 (progn
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
994 (calculator-clear-fragile)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
995 (let ((digit (upcase (char-to-string inp))))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
996 (if (equal calculator-curnum "0")
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
997 (setq calculator-curnum nil))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
998 (setq calculator-curnum
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
999 (concat (or calculator-curnum "") digit)))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1000 (calculator-update-display)))))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1001
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1002 (defun calculator-decimal ()
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1003 "Enter a decimal period."
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1004 (interactive)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1005 (if (and (not calculator-input-radix)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1006 (or calculator-display-fragile
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1007 (not (numberp (car calculator-stack))))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1008 (not (and calculator-curnum
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1009 (string-match "[.eE]" calculator-curnum))))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1010 ;; enter the period on the same condition as a digit, only if no
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1011 ;; period or exponent entered yet.
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1012 (progn
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1013 (calculator-clear-fragile)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1014 (setq calculator-curnum (concat (or calculator-curnum "0") "."))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1015 (calculator-update-display))))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1016
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1017 (defun calculator-exp ()
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1018 "Enter an `E' exponent character, or a digit in hex input mode."
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1019 (interactive)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1020 (if calculator-input-radix
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1021 (calculator-digit)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1022 (if (and (or calculator-display-fragile
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1023 (not (numberp (car calculator-stack))))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1024 (not (and calculator-curnum
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1025 (string-match "[eE]" calculator-curnum))))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1026 ;; same condition as above, also no E so far.
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1027 (progn
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1028 (calculator-clear-fragile)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1029 (setq calculator-curnum (concat (or calculator-curnum "1") "e"))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1030 (calculator-update-display)))))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1031
27904
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
1032 (defun calculator-op (&optional keys)
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
1033 "Enter an operator on the stack, doing all necessary reductions.
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
1034 Optional string argument KEYS will force using it as the keys entered."
27587
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1035 (interactive)
27904
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
1036 (let* ((last-inp (calculator-last-input keys))
27587
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1037 (op (assoc last-inp calculator-operators)))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1038 (calculator-clear-fragile op)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1039 (if (and calculator-curnum (/= (calculator-op-arity op) 0))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1040 (setq calculator-stack
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1041 (cons (calculator-curnum-value) calculator-stack)))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1042 (setq calculator-curnum nil)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1043 (if (and (= 2 (calculator-op-arity op))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1044 (not (and calculator-stack
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1045 (numberp (nth 0 calculator-stack)))))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1046 ;; we have a binary operator but no number - search for a prefix
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1047 ;; version
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1048 (let ((rest-ops calculator-operators))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1049 (while (not (equal last-inp (car (car rest-ops))))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1050 (setq rest-ops (cdr rest-ops)))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1051 (setq op (assoc last-inp (cdr rest-ops)))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1052 (if (not (and op (= -1 (calculator-op-arity op))))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1053 (error "Binary operator without a first operand"))))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1054 (calculator-reduce-stack
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1055 (cond ((eq (nth 1 op) '\() 10)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1056 ((eq (nth 1 op) '\)) 0)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1057 (t (calculator-op-prec op))))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1058 (if (or (and (= -1 (calculator-op-arity op))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1059 (numberp (car calculator-stack)))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1060 (and (/= (calculator-op-arity op) -1)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1061 (/= (calculator-op-arity op) 0)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1062 (not (numberp (car calculator-stack)))))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1063 (error "Unterminated expression"))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1064 (setq calculator-stack (cons op calculator-stack))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1065 (calculator-reduce-stack (calculator-op-prec op))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1066 (and (= (length calculator-stack) 1)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1067 (numberp (nth 0 calculator-stack))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1068 ;; the display is fragile if it contains only one number
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1069 (setq calculator-display-fragile t)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1070 ;; add number to the saved-list
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1071 calculator-add-saved
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1072 (if (= 0 calculator-saved-ptr)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1073 (setq calculator-saved-list
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1074 (cons (car calculator-stack) calculator-saved-list))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1075 (let ((p (nthcdr (1- calculator-saved-ptr)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1076 calculator-saved-list)))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1077 (setcdr p (cons (car calculator-stack) (cdr p))))))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1078 (calculator-update-display)))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1079
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1080 (defun calculator-op-or-exp ()
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1081 "Either enter an operator or a digit.
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1082 Used with +/- for entering them as digits in numbers like 1e-3."
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1083 (interactive)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1084 (if (and (not calculator-display-fragile)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1085 calculator-curnum
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1086 (string-match "[eE]$" calculator-curnum))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1087 (calculator-digit)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1088 (calculator-op)))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1089
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1090 (defun calculator-dec/deg-mode ()
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1091 "Set decimal mode for display & input, if decimal, toggle deg mode."
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1092 (interactive)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1093 (if calculator-curnum
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1094 (setq calculator-stack
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1095 (cons (calculator-curnum-value) calculator-stack)))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1096 (setq calculator-curnum nil)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1097 (if (or calculator-input-radix calculator-output-radix)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1098 (progn (setq calculator-input-radix nil)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1099 (setq calculator-output-radix nil))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1100 ;; already decimal - toggle degrees mode
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1101 (setq calculator-deg (not calculator-deg)))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1102 (calculator-update-display t))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1103
27904
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
1104 (defun calculator-radix-mode (&optional keys)
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
1105 "Set input and display radix modes.
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
1106 Optional string argument KEYS will force using it as the keys entered."
27587
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1107 (interactive)
27904
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
1108 (calculator-radix-input-mode keys)
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
1109 (calculator-radix-output-mode keys))
27587
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1110
27904
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
1111 (defun calculator-radix-input-mode (&optional keys)
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
1112 "Set input radix modes.
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
1113 Optional string argument KEYS will force using it as the keys entered."
27587
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1114 (interactive)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1115 (if calculator-curnum
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1116 (setq calculator-stack
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1117 (cons (calculator-curnum-value) calculator-stack)))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1118 (setq calculator-curnum nil)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1119 (setq calculator-input-radix
27904
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
1120 (let ((inp (calculator-last-input keys)))
27587
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1121 (cdr (assq (upcase (aref inp (1- (length inp))))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1122 calculator-char-radix))))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1123 (calculator-update-display))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1124
27904
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
1125 (defun calculator-radix-output-mode (&optional keys)
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
1126 "Set display radix modes.
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
1127 Optional string argument KEYS will force using it as the keys entered."
27587
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1128 (interactive)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1129 (if calculator-curnum
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1130 (setq calculator-stack
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1131 (cons (calculator-curnum-value) calculator-stack)))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1132 (setq calculator-curnum nil)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1133 (setq calculator-output-radix
27904
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
1134 (let ((inp (calculator-last-input keys)))
27587
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1135 (cdr (assq (upcase (aref inp (1- (length inp))))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1136 calculator-char-radix))))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1137 (calculator-update-display t))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1138
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1139 (defun calculator-save-on-list ()
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1140 "Evaluate current expression, put result on the saved values list."
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1141 (interactive)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1142 (let ((calculator-add-saved t)) ; marks the result to be added
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1143 (calculator-enter)))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1144
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1145 (defun calculator-clear-saved ()
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1146 "Clear the list of saved values in `calculator-saved-list'."
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1147 (interactive)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1148 (setq calculator-saved-list nil)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1149 (calculator-update-display t))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1150
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1151 (defun calculator-saved-move (n)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1152 "Go N elements up the list of saved values."
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1153 (interactive)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1154 (and calculator-saved-list
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1155 (or (null calculator-stack) calculator-display-fragile)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1156 (progn
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1157 (setq calculator-saved-ptr
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1158 (max (min (+ n calculator-saved-ptr)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1159 (length calculator-saved-list))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1160 0))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1161 (if (nth calculator-saved-ptr calculator-saved-list)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1162 (setq calculator-stack
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1163 (list (nth calculator-saved-ptr calculator-saved-list))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1164 calculator-display-fragile t)
27904
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
1165 (calculator-reset))
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
1166 (calculator-update-display))))
27587
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1167
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1168 (defun calculator-saved-up ()
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1169 "Go up the list of saved values."
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1170 (interactive)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1171 (calculator-saved-move +1))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1172
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1173 (defun calculator-saved-down ()
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1174 "Go down the list of saved values."
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1175 (interactive)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1176 (calculator-saved-move -1))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1177
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1178 (defun calculator-open-paren ()
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1179 "Equivalents of `(' use this."
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1180 (interactive)
27904
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
1181 (calculator-op "("))
27587
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1182
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1183 (defun calculator-close-paren ()
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1184 "Equivalents of `)' use this."
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1185 (interactive)
27904
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
1186 (calculator-op ")"))
27587
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1187
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1188 (defun calculator-enter ()
27904
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
1189 "Evaluate current expression."
27587
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1190 (interactive)
27904
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
1191 (calculator-op "="))
27587
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1192
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1193 (defun calculator-backspace ()
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1194 "Backward delete a single digit or a stack element."
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1195 (interactive)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1196 (if calculator-curnum
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1197 (setq calculator-curnum
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1198 (if (> (length calculator-curnum) 1)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1199 (substring calculator-curnum
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1200 0 (1- (length calculator-curnum)))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1201 nil))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1202 (setq calculator-stack (cdr calculator-stack)))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1203 (calculator-update-display))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1204
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1205 (defun calculator-clear ()
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1206 "Clear current number."
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1207 (interactive)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1208 (setq calculator-curnum nil)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1209 (cond
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1210 ;; if the current number is from the saved-list - remove it
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1211 ((and calculator-display-fragile
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1212 calculator-saved-list
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1213 (= (car calculator-stack)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1214 (nth calculator-saved-ptr calculator-saved-list)))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1215 (if (= 0 calculator-saved-ptr)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1216 (setq calculator-saved-list (cdr calculator-saved-list))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1217 (let ((p (nthcdr (1- calculator-saved-ptr)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1218 calculator-saved-list)))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1219 (setcdr p (cdr (cdr p)))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1220 (setq calculator-saved-ptr (1- calculator-saved-ptr))))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1221 (if calculator-saved-list
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1222 (setq calculator-stack
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1223 (list (nth calculator-saved-ptr calculator-saved-list)))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1224 (calculator-reset)))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1225 ;; reset if fragile or double clear
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1226 ((or calculator-display-fragile (eq last-command this-command))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1227 (calculator-reset)))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1228 (calculator-update-display))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1229
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1230 (defun calculator-copy ()
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1231 "Copy current number to the `kill-ring'."
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1232 (interactive)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1233 (calculator-enter)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1234 ;; remove trailing .0 and spaces .0
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1235 (let ((s (cdr calculator-stack-display)))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1236 (if (string-match "^\\(.*[^ ]\\) *$" s)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1237 (setq s (match-string 1 s)))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1238 (kill-new s)))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1239
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1240 (defun calculator-set-register (reg)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1241 "Set a register value for REG."
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1242 (interactive "cRegister to store into: ")
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1243 (let* ((as (assq reg calculator-registers))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1244 (val (progn (calculator-enter) (car calculator-stack))))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1245 (if as
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1246 (setcdr as val)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1247 (setq calculator-registers
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1248 (cons (cons reg val) calculator-registers)))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1249 (message (format "[%c] := %S" reg val))))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1250
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1251 (defun calculator-put-value (val)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1252 "Paste VAL as if entered.
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1253 Used by `calculator-paste' and `get-register'."
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1254 (if (and (numberp val)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1255 ;; (not calculator-curnum)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1256 (or calculator-display-fragile
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1257 (not (numberp (car calculator-stack)))))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1258 (progn
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1259 (calculator-clear-fragile)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1260 (setq calculator-curnum (calculator-num-to-string val))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1261 (calculator-update-display))))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1262
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1263 (defun calculator-paste ()
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1264 "Paste a value from the `kill-ring'."
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1265 (interactive)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1266 (calculator-put-value
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1267 (condition-case nil (car (read-from-string (current-kill 0)))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1268 (error nil))))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1269
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1270 (defun calculator-get-register (reg)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1271 "Get a value from a register REG."
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1272 (interactive "cRegister to get value from: ")
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1273 (calculator-put-value (cdr (assq reg calculator-registers))))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1274
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1275 (defun calculator-help ()
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1276 ;; this is used as the quick reference screen you get with `h'
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1277 "Quick reference:
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1278 * numbers/operators/parens/./e - enter expressions
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1279 + - * / \\(div) %(rem) _(-X,postfix) ;(1/X,postfix) ^(exp) L(og)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1280 Q(sqrt) !(fact) S(in) C(os) T(an) |(or) #(xor) &(and) ~(not)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1281 * >/< repeats last binary operation with its 2nd (1st) arg as postfix op
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1282 * I inverses next trig function
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1283 * D - switch to all-decimal mode, or toggles deg/rad mode
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1284 * B/O/H/X - binary/octal/hex mode for i/o (X is a shortcut for H)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1285 * i/o - prefix for d/b/o/x - set only input/output modes
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1286 * enter/= - evaluate current expr. * s/g - set/get a register
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1287 * space - evaluate & save on list * l/v - list total/average
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1288 * up/down/C-p/C-n - browse saved * C-delete - clear all saved
27904
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
1289 * C-insert - copy whole expr. * C-return - evaluate, copy, exit
27587
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1290 * insert - paste a number * backspace- delete backwards
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1291 * delete - clear argument or list value or whole expression (twice)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1292 * escape/q - exit."
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1293 (interactive)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1294 (if (eq last-command 'calculator-help)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1295 (let ((mode-name "Calculator")
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1296 (major-mode 'calculator-mode)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1297 (g-map (current-global-map))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1298 (win (selected-window)))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1299 (require 'ehelp)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1300 (if calculator-electric-mode
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1301 (use-global-map calculator-saved-global-map))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1302 (electric-describe-mode)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1303 (if calculator-electric-mode
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1304 (use-global-map g-map))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1305 (select-window win) ; these are for XEmacs (also below)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1306 (message nil))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1307 (let ((one (one-window-p t))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1308 (win (selected-window))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1309 (help-buf (get-buffer-create "*Help*")))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1310 (save-window-excursion
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1311 (with-output-to-temp-buffer "*Help*"
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1312 (princ (documentation 'calculator-help)))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1313 (if one
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1314 (shrink-window-if-larger-than-buffer
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1315 (get-buffer-window help-buf)))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1316 (message
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1317 "`%s' again for more help, any other key continues normally."
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1318 (calculator-last-input))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1319 (select-window win)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1320 (sit-for 360))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1321 (select-window win))))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1322
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1323 (defun calculator-quit ()
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1324 "Quit calculator."
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1325 (interactive)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1326 (set-buffer calculator-buffer)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1327 (let ((inhibit-read-only t)) (erase-buffer))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1328 (if (not calculator-electric-mode)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1329 (progn
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1330 (condition-case nil
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1331 (while (get-buffer-window calculator-buffer)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1332 (delete-window (get-buffer-window calculator-buffer)))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1333 (error nil))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1334 (kill-buffer calculator-buffer)))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1335 (setq calculator-buffer nil)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1336 (message "Calculator done.")
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1337 (if calculator-electric-mode (throw 'calculator-done nil)))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1338
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1339 (defun calculator-save-and-quit ()
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1340 "Quit the calculator, saving the result on the `kill-ring'."
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1341 (interactive)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1342 (calculator-enter)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1343 (calculator-copy)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1344 (calculator-quit))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1345
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1346 (defun calculator-funcall (f &optional X Y)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1347 "If F is a symbol, evaluate (F X Y).
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1348 Otherwise, it should be a list, evaluate it with X, Y bound to the
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1349 arguments."
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1350 ;; remember binary ops for calculator-repR/L
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1351 (if Y (setq calculator-last-opXY (list f X Y)))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1352 (condition-case nil
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1353 (let ((result
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1354 (if (symbolp f)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1355 (cond ((and X Y) (funcall f X Y))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1356 (X (funcall f X))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1357 (t (funcall f)))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1358 ;; f is an expression
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1359 (let* ((__f__ f) ; so we can get this value below...
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1360 (TX (calculator-truncate X))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1361 (TY (and Y (calculator-truncate Y)))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1362 (DX (if calculator-deg (/ (* X pi) 180) X))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1363 (L calculator-saved-list)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1364 (Fbound (fboundp 'F))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1365 (Fsave (and Fbound (symbol-function 'F)))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1366 (Dbound (fboundp 'D))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1367 (Dsave (and Dbound (symbol-function 'D))))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1368 ;; a shortened version of flet
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1369 (fset 'F (function
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1370 (lambda (&optional x y)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1371 (calculator-funcall __f__ x y))))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1372 (fset 'D (function
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1373 (lambda (x)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1374 (if calculator-deg (/ (* x 180) pi) x))))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1375 (unwind-protect (eval f)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1376 (if Fbound (fset 'F Fsave) (fmakunbound 'F))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1377 (if Dbound (fset 'D Dsave) (fmakunbound 'D)))))))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1378 (if (< (abs result) calculator-epsilon)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1379 0
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1380 result))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1381 (error 0)))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1382
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1383 (defun calculator-repR (x)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1384 "Repeats the last binary operation with its second argument and X.
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1385 To use this, apply a binary operator (evaluate it), then call this."
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1386 (if calculator-last-opXY
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1387 ;; avoid rebinding calculator-last-opXY
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1388 (let ((calculator-last-opXY calculator-last-opXY))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1389 (calculator-funcall
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1390 (car calculator-last-opXY) x (nth 2 calculator-last-opXY)))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1391 x))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1392
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1393 (defun calculator-repL (x)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1394 "Repeats the last binary operation with its first argument and X.
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1395 To use this, apply a binary operator (evaluate it), then call this."
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1396 (if calculator-last-opXY
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1397 ;; avoid rebinding calculator-last-opXY
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1398 (let ((calculator-last-opXY calculator-last-opXY))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1399 (calculator-funcall
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1400 (car calculator-last-opXY) (nth 1 calculator-last-opXY) x))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1401 x))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1402
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1403 (defun calculator-fact (x)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1404 "Simple factorial of X."
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1405 (let ((r (if (<= x 10) 1 1.0)))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1406 (while (> x 0)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1407 (setq r (* r (truncate x)))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1408 (setq x (1- x)))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1409 r))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1410
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1411 (defun calculator-truncate (n)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1412 "Truncate N, return 0 in case of overflow."
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1413 (condition-case nil (truncate n) (error 0)))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1414
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1415
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1416 (provide 'calculator)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1417
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1418 ;;; calculator.el ends here