annotate lisp/calculator.el @ 110410:f2e111723c3a

Merge changes made in Gnus trunk. Reimplement nnimap, and do tweaks to the rest of the code to support that. * gnus-int.el (gnus-finish-retrieve-group-infos) (gnus-retrieve-group-data-early): New functions. * gnus-range.el (gnus-range-nconcat): New function. * gnus-start.el (gnus-get-unread-articles): Support early retrieval of data. (gnus-read-active-for-groups): Support finishing the early retrieval of data. * gnus-sum.el (gnus-summary-move-article): Pass the move-to group name if the move is internal, so that nnimap can do fast internal moves. * gnus.el (gnus-article-special-mark-lists): Add uid/active tuples, for nnimap usage. * nnimap.el: Rewritten. * nnmail.el (nnmail-inhibit-default-split-group): New internal variable to allow the mail splitting to not return a default group. This is useful for nnimap, which will leave unmatched mail in the inbox. * utf7.el (utf7-encode): Autoload. Implement shell connection. * nnimap.el (nnimap-open-shell-stream): New function. (nnimap-open-connection): Use it. Get the number of lines by using BODYSTRUCTURE. (nnimap-transform-headers): Get the number of lines in each message. (nnimap-retrieve-headers): Query for BODYSTRUCTURE so that we get the number of lines. Not all servers return UIDNEXT. Work past this problem. Remove junk from end of file. Fix typo in "bogus" section. Make capabilties be case-insensitive. Require cl when compiling. Don't bug out if the LIST command doesn't have any parameters. 2010-09-17 Knut Anders Hatlen <kahatlen@gmail.com> (tiny change) * nnimap.el (nnimap-get-groups): Don't bug out if the LIST command doesn't have any parameters. (mm-text-html-renderer): Document gnus-article-html. 2010-09-17 Julien Danjou <julien@danjou.info> (tiny fix) * mm-decode.el (mm-text-html-renderer): Document gnus-article-html. * dgnushack.el: Define netrc-credentials. If the user doesn't have a /etc/services, supply some sensible port defaults. Have `unseen-or-unread' select an unread unseen article first. (nntp-open-server): Return whether the open was successful or not. Throughout all files, replace (save-excursion (set-buffer ...)) with (with-current-buffer ... ). Save result so that it doesn't say "failed" all the time. Add ~/.authinfo to the default, since that's probably most useful for users. Don't use the "finish" method when we're reading from the agent. Add some more nnimap-relevant agent stuff to nnagent.el. * nnimap.el (nnimap-with-process-buffer): Removed. Revert one line that was changed by mistake in the last checkin. (nnimap-open-connection): Don't error out when we can't make a connection nnimap-related changes to avoid bugging out if we can't contact a server. * gnus-start.el (gnus-get-unread-articles): Don't try to scan groups from methods that are denied. * nnimap.el (nnimap-possibly-change-group): Return nil if we can't log in. (nnimap-finish-retrieve-group-infos): Make sure we're not waiting for nothing. * gnus-sum.el (gnus-select-newsgroup): Indent.
author Katsumi Yamaoka <yamaoka@jpl.org>
date Sat, 18 Sep 2010 10:02:19 +0000
parents 904ccd8f2acb
children b799d38f522a
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
38436
b174db545cfd Some fixes to follow coding conventions.
Pavel Janík <Pavel@Janik.cz>
parents: 35314
diff changeset
1 ;;; calculator.el --- a [not so] simple calculator for Emacs
27587
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2
94680
5af369a095b7 Switch to recommended form of GPLv3 permissions notice.
Glenn Morris <rgm@gnu.org>
parents: 94391
diff changeset
3 ;; Copyright (C) 1998, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007,
106815
1d1d5d9bd884 Add 2010 to copyright years.
Glenn Morris <rgm@gnu.org>
parents: 100908
diff changeset
4 ;; 2008, 2009, 2010 Free Software Foundation, Inc.
27587
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
5
35314
9199190adb77 Fix author's e-mail.
Dave Love <fx@gnu.org>
parents: 35214
diff changeset
6 ;; Author: Eli Barzilay <eli@barzilay.org>
27587
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
7 ;; Keywords: tools, convenience
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
94680
5af369a095b7 Switch to recommended form of GPLv3 permissions notice.
Glenn Morris <rgm@gnu.org>
parents: 94391
diff changeset
11 ;; GNU Emacs is free software: you can redistribute it and/or modify
5af369a095b7 Switch to recommended form of GPLv3 permissions notice.
Glenn Morris <rgm@gnu.org>
parents: 94391
diff changeset
12 ;; it under the terms of the GNU General Public License as published by
5af369a095b7 Switch to recommended form of GPLv3 permissions notice.
Glenn Morris <rgm@gnu.org>
parents: 94391
diff changeset
13 ;; the Free Software Foundation, either version 3 of the License, or
5af369a095b7 Switch to recommended form of GPLv3 permissions notice.
Glenn Morris <rgm@gnu.org>
parents: 94391
diff changeset
14 ;; (at your option) any later version.
27587
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
15
94680
5af369a095b7 Switch to recommended form of GPLv3 permissions notice.
Glenn Morris <rgm@gnu.org>
parents: 94391
diff changeset
16 ;; GNU Emacs is distributed in the hope that it will be useful,
5af369a095b7 Switch to recommended form of GPLv3 permissions notice.
Glenn Morris <rgm@gnu.org>
parents: 94391
diff changeset
17 ;; but WITHOUT ANY WARRANTY; without even the implied warranty of
5af369a095b7 Switch to recommended form of GPLv3 permissions notice.
Glenn Morris <rgm@gnu.org>
parents: 94391
diff changeset
18 ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
5af369a095b7 Switch to recommended form of GPLv3 permissions notice.
Glenn Morris <rgm@gnu.org>
parents: 94391
diff changeset
19 ;; GNU General Public License for more details.
27587
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
94680
5af369a095b7 Switch to recommended form of GPLv3 permissions notice.
Glenn Morris <rgm@gnu.org>
parents: 94391
diff changeset
22 ;; along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>.
27587
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
23
33631
86ab384be9d7 New version from author.
Gerd Moellmann <gerd@gnu.org>
parents: 33551
diff changeset
24 ;;;=====================================================================
27587
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
25 ;;; Commentary:
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
26 ;;
33491
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
27 ;; A calculator for Emacs.
33551
dd42fdd51753 Fix a typo in a comment.
Eli Zaretskii <eliz@gnu.org>
parents: 33491
diff changeset
28 ;; Why should you reach for your mouse to get xcalc (calc.exe, gcalc or
33491
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
29 ;; whatever), when you have Emacs running already?
27587
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"
33491
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
34 ;; "Run the Emacs calculator." t)
27587
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 ;;
33491
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
37 ;; Written by Eli Barzilay: Maze is Life! eli@barzilay.org
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
38 ;; http://www.barzilay.org/
27587
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
33491
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
41 ;; http://www.barzilay.org/misc/calculator.el
39430
48633cf4ce7c (calculator-copy-displayer): New user-option.
Gerd Moellmann <gerd@gnu.org>
parents: 38436
diff changeset
42 ;;
48633cf4ce7c (calculator-copy-displayer): New user-option.
Gerd Moellmann <gerd@gnu.org>
parents: 38436
diff changeset
43
48633cf4ce7c (calculator-copy-displayer): New user-option.
Gerd Moellmann <gerd@gnu.org>
parents: 38436
diff changeset
44 ;;; History:
48633cf4ce7c (calculator-copy-displayer): New user-option.
Gerd Moellmann <gerd@gnu.org>
parents: 38436
diff changeset
45 ;; I hate history.
27587
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
46
83794
4f498b7dbb7f Require cl for compilation.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 82140
diff changeset
47 (eval-when-compile (require 'cl))
27587
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
48
33631
86ab384be9d7 New version from author.
Gerd Moellmann <gerd@gnu.org>
parents: 33551
diff changeset
49 ;;;=====================================================================
27587
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
50 ;;; Customization:
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
51
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
52 (defgroup calculator nil
33491
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
53 "Simple Emacs calculator."
27587
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
54 :prefix "calculator"
30889
5f9c434a6e88 (calculator): Add :version.
Dave Love <fx@gnu.org>
parents: 27904
diff changeset
55 :version "21.1"
27587
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
56 :group 'tools
107378
904ccd8f2acb Reorganize Custom groups.
Chong Yidong <cyd@stupidchicken.com>
parents: 107342
diff changeset
57 :group 'applications)
27587
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
58
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
59 (defcustom calculator-electric-mode nil
100171
d42aff5ca541 * align.el:
Lute Kamstra <lute@gnu.org>
parents: 99899
diff changeset
60 "Run `calculator' electrically, in the echo area.
33491
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
61 Electric mode saves some place but changes the way you interact with the
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
62 calculator."
27587
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
63 :type 'boolean
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
64 :group 'calculator)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
65
27904
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
66 (defcustom calculator-use-menu t
100171
d42aff5ca541 * align.el:
Lute Kamstra <lute@gnu.org>
parents: 99899
diff changeset
67 "Make `calculator' create a menu.
27904
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
68 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
69 :type 'boolean
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
70 :group 'calculator)
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
71
27587
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
72 (defcustom calculator-bind-escape nil
100171
d42aff5ca541 * align.el:
Lute Kamstra <lute@gnu.org>
parents: 99899
diff changeset
73 "If non-nil, set escape to exit the calculator."
27587
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
74 :type 'boolean
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
75 :group 'calculator)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
76
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
77 (defcustom calculator-unary-style 'postfix
100171
d42aff5ca541 * align.el:
Lute Kamstra <lute@gnu.org>
parents: 99899
diff changeset
78 "Value is either 'prefix or 'postfix.
27587
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
79 This determines the default behavior of unary operators."
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
80 :type '(choice (const prefix) (const postfix))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
81 :group 'calculator)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
82
33491
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
83 (defcustom calculator-prompt "Calc=%s> "
100171
d42aff5ca541 * align.el:
Lute Kamstra <lute@gnu.org>
parents: 99899
diff changeset
84 "The prompt used by the Emacs calculator.
75773
8344ba1076b6 (calculator-mode-map): Fix typo in menu entry.
Juanma Barranquero <lekktu@gmail.com>
parents: 75762
diff changeset
85 It should contain a \"%s\" somewhere that will indicate the i/o radixes;
8344ba1076b6 (calculator-mode-map): Fix typo in menu entry.
Juanma Barranquero <lekktu@gmail.com>
parents: 75762
diff changeset
86 this will be a two-character string as described in the documentation
8344ba1076b6 (calculator-mode-map): Fix typo in menu entry.
Juanma Barranquero <lekktu@gmail.com>
parents: 75762
diff changeset
87 for `calculator-mode'."
27587
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
88 :type 'string
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
89 :group 'calculator)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
90
33491
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
91 (defcustom calculator-number-digits 3
100171
d42aff5ca541 * align.el:
Lute Kamstra <lute@gnu.org>
parents: 99899
diff changeset
92 "The calculator's number of digits used for standard display.
33491
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
93 Used by the `calculator-standard-display' function - it will use the
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
94 format string \"%.NC\" where this number is N and C is a character given
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
95 at runtime."
35214
668b2bcf528a (calculator-number-digits): Fix :type.
Dave Love <fx@gnu.org>
parents: 33631
diff changeset
96 :type 'integer
27587
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
97 :group 'calculator)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
98
59056
956483cc3659 (calculator-radix-grouping-mode)
Richard M. Stallman <rms@gnu.org>
parents: 52401
diff changeset
99 (defcustom calculator-radix-grouping-mode t
100171
d42aff5ca541 * align.el:
Lute Kamstra <lute@gnu.org>
parents: 99899
diff changeset
100 "Use digit grouping in radix output mode.
59056
956483cc3659 (calculator-radix-grouping-mode)
Richard M. Stallman <rms@gnu.org>
parents: 52401
diff changeset
101 If this is set, chunks of `calculator-radix-grouping-digits' characters
956483cc3659 (calculator-radix-grouping-mode)
Richard M. Stallman <rms@gnu.org>
parents: 52401
diff changeset
102 will be separated by `calculator-radix-grouping-separator' when in radix
62531
c905fcf5e3d9 Specify missing group (and type, if simple) in defcustom.
Juanma Barranquero <lekktu@gmail.com>
parents: 59056
diff changeset
103 output mode is active (determined by `calculator-output-radix')."
c905fcf5e3d9 Specify missing group (and type, if simple) in defcustom.
Juanma Barranquero <lekktu@gmail.com>
parents: 59056
diff changeset
104 :type 'boolean
c905fcf5e3d9 Specify missing group (and type, if simple) in defcustom.
Juanma Barranquero <lekktu@gmail.com>
parents: 59056
diff changeset
105 :group 'calculator)
59056
956483cc3659 (calculator-radix-grouping-mode)
Richard M. Stallman <rms@gnu.org>
parents: 52401
diff changeset
106
956483cc3659 (calculator-radix-grouping-mode)
Richard M. Stallman <rms@gnu.org>
parents: 52401
diff changeset
107 (defcustom calculator-radix-grouping-digits 4
100171
d42aff5ca541 * align.el:
Lute Kamstra <lute@gnu.org>
parents: 99899
diff changeset
108 "The number of digits used for grouping display in radix modes.
62531
c905fcf5e3d9 Specify missing group (and type, if simple) in defcustom.
Juanma Barranquero <lekktu@gmail.com>
parents: 59056
diff changeset
109 See `calculator-radix-grouping-mode'."
c905fcf5e3d9 Specify missing group (and type, if simple) in defcustom.
Juanma Barranquero <lekktu@gmail.com>
parents: 59056
diff changeset
110 :type 'integer
c905fcf5e3d9 Specify missing group (and type, if simple) in defcustom.
Juanma Barranquero <lekktu@gmail.com>
parents: 59056
diff changeset
111 :group 'calculator)
59056
956483cc3659 (calculator-radix-grouping-mode)
Richard M. Stallman <rms@gnu.org>
parents: 52401
diff changeset
112
956483cc3659 (calculator-radix-grouping-mode)
Richard M. Stallman <rms@gnu.org>
parents: 52401
diff changeset
113 (defcustom calculator-radix-grouping-separator "'"
100171
d42aff5ca541 * align.el:
Lute Kamstra <lute@gnu.org>
parents: 99899
diff changeset
114 "The separator used in radix grouping display.
62531
c905fcf5e3d9 Specify missing group (and type, if simple) in defcustom.
Juanma Barranquero <lekktu@gmail.com>
parents: 59056
diff changeset
115 See `calculator-radix-grouping-mode'."
c905fcf5e3d9 Specify missing group (and type, if simple) in defcustom.
Juanma Barranquero <lekktu@gmail.com>
parents: 59056
diff changeset
116 :type 'string
c905fcf5e3d9 Specify missing group (and type, if simple) in defcustom.
Juanma Barranquero <lekktu@gmail.com>
parents: 59056
diff changeset
117 :group 'calculator)
59056
956483cc3659 (calculator-radix-grouping-mode)
Richard M. Stallman <rms@gnu.org>
parents: 52401
diff changeset
118
33491
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
119 (defcustom calculator-remove-zeros t
100171
d42aff5ca541 * align.el:
Lute Kamstra <lute@gnu.org>
parents: 99899
diff changeset
120 "Non-nil value means delete all redundant zero decimal digits.
33491
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
121 If this value is not t, and not nil, redundant zeros are removed except
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
122 for one and if it is nil, nothing is removed.
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
123 Used by the `calculator-remove-zeros' function."
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
124 :type '(choice (const t) (const leave-decimal) (const nil))
27587
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
125 :group 'calculator)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
126
33491
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
127 (defcustom calculator-displayer '(std ?n)
100171
d42aff5ca541 * align.el:
Lute Kamstra <lute@gnu.org>
parents: 99899
diff changeset
128 "A displayer specification for numerical values.
33491
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
129 This is the displayer used to show all numbers in an expression. Result
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
130 values will be displayed according to the first element of
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
131 `calculator-displayers'.
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
132
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
133 The displayer is a symbol, a string or an expression. A symbol should
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
134 be the name of a one-argument function, a string is used with a single
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
135 argument and an expression will be evaluated with the variable `num'
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
136 bound to whatever should be displayed. If it is a function symbol, it
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
137 should be able to handle special symbol arguments, currently 'left and
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
138 'right which will be sent by special keys to modify display parameters
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
139 associated with the displayer function (for example to change the number
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
140 of digits displayed).
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
141
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
142 An exception to the above is the case of the list (std C) where C is a
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
143 character, in this case the `calculator-standard-displayer' function
62531
c905fcf5e3d9 Specify missing group (and type, if simple) in defcustom.
Juanma Barranquero <lekktu@gmail.com>
parents: 59056
diff changeset
144 will be used with this character for a format string."
c905fcf5e3d9 Specify missing group (and type, if simple) in defcustom.
Juanma Barranquero <lekktu@gmail.com>
parents: 59056
diff changeset
145 :group 'calculator)
33491
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
146
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
147 (defcustom calculator-displayers
43091
f18f05d77411 (calculator-displayers): Doc fixes.
Pavel Janík <Pavel@Janik.cz>
parents: 39818
diff changeset
148 '(((std ?n) "Standard display, decimal point or scientific")
33491
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
149 (calculator-eng-display "Eng display")
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
150 ((std ?f) "Standard display, decimal point")
43091
f18f05d77411 (calculator-displayers): Doc fixes.
Pavel Janík <Pavel@Janik.cz>
parents: 39818
diff changeset
151 ((std ?e) "Standard display, scientific")
33491
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
152 ("%S" "Emacs printer"))
100171
d42aff5ca541 * align.el:
Lute Kamstra <lute@gnu.org>
parents: 99899
diff changeset
153 "A list of displayers.
33491
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
154 Each element is a list of a displayer and a description string. The
43091
f18f05d77411 (calculator-displayers): Doc fixes.
Pavel Janík <Pavel@Janik.cz>
parents: 39818
diff changeset
155 first element is the one which is currently used, this is for the display
33491
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
156 of result values not values in expressions. A displayer specification
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
157 is the same as the values that can be stored in `calculator-displayer'.
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
158
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
159 `calculator-rotate-displayer' rotates this list."
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
160 :type 'sexp
27587
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
161 :group 'calculator)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
162
33491
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
163 (defcustom calculator-paste-decimals t
100171
d42aff5ca541 * align.el:
Lute Kamstra <lute@gnu.org>
parents: 99899
diff changeset
164 "If non-nil, convert pasted integers so they have a decimal point.
33491
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
165 This makes it possible to paste big integers since they will be read as
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
166 floats, otherwise the Emacs reader will fail on them."
27587
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
167 :type 'boolean
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
168 :group 'calculator)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
169
39430
48633cf4ce7c (calculator-copy-displayer): New user-option.
Gerd Moellmann <gerd@gnu.org>
parents: 38436
diff changeset
170 (defcustom calculator-copy-displayer nil
100171
d42aff5ca541 * align.el:
Lute Kamstra <lute@gnu.org>
parents: 99899
diff changeset
171 "If non-nil, this is any value that can be used for
39430
48633cf4ce7c (calculator-copy-displayer): New user-option.
Gerd Moellmann <gerd@gnu.org>
parents: 38436
diff changeset
172 `calculator-displayer', to format a string before copying it with
48633cf4ce7c (calculator-copy-displayer): New user-option.
Gerd Moellmann <gerd@gnu.org>
parents: 38436
diff changeset
173 `calculator-copy'. If nil, then `calculator-displayer's normal value is
62531
c905fcf5e3d9 Specify missing group (and type, if simple) in defcustom.
Juanma Barranquero <lekktu@gmail.com>
parents: 59056
diff changeset
174 used."
c905fcf5e3d9 Specify missing group (and type, if simple) in defcustom.
Juanma Barranquero <lekktu@gmail.com>
parents: 59056
diff changeset
175 :type 'boolean
c905fcf5e3d9 Specify missing group (and type, if simple) in defcustom.
Juanma Barranquero <lekktu@gmail.com>
parents: 59056
diff changeset
176 :group 'calculator)
39430
48633cf4ce7c (calculator-copy-displayer): New user-option.
Gerd Moellmann <gerd@gnu.org>
parents: 38436
diff changeset
177
27587
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
178 (defcustom calculator-2s-complement nil
100171
d42aff5ca541 * align.el:
Lute Kamstra <lute@gnu.org>
parents: 99899
diff changeset
179 "If non-nil, show negative numbers in 2s complement in radix modes.
27587
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
180 Otherwise show as a negative number."
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
181 :type 'boolean
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
182 :group 'calculator)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
183
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
184 (defcustom calculator-mode-hook nil
100171
d42aff5ca541 * align.el:
Lute Kamstra <lute@gnu.org>
parents: 99899
diff changeset
185 "List of hook functions for `calculator-mode' to run.
59056
956483cc3659 (calculator-radix-grouping-mode)
Richard M. Stallman <rms@gnu.org>
parents: 52401
diff changeset
186 Note: if `calculator-electric-mode' is on, then this hook will get
956483cc3659 (calculator-radix-grouping-mode)
Richard M. Stallman <rms@gnu.org>
parents: 52401
diff changeset
187 activated in the minibuffer - in that case it should not do much more
956483cc3659 (calculator-radix-grouping-mode)
Richard M. Stallman <rms@gnu.org>
parents: 52401
diff changeset
188 than local key settings and other effects that will change things
956483cc3659 (calculator-radix-grouping-mode)
Richard M. Stallman <rms@gnu.org>
parents: 52401
diff changeset
189 outside the scope of calculator related code."
27587
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
190 :type 'hook
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
191 :group 'calculator)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
192
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
193 (defcustom calculator-user-registers nil
100171
d42aff5ca541 * align.el:
Lute Kamstra <lute@gnu.org>
parents: 99899
diff changeset
194 "An association list of user-defined register bindings.
27587
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
195 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
196 will be stored in that character's register.
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
197
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
198 For example, use this to define the golden ratio number:
33491
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
199 (setq calculator-user-registers '((?g . 1.61803398875)))
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
200 before you load calculator."
27587
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
201 :type '(repeat (cons character number))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
202 :set '(lambda (_ val)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
203 (and (boundp 'calculator-registers)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
204 (setq calculator-registers
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
205 (append val calculator-registers)))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
206 (setq calculator-user-registers val))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
207 :group 'calculator)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
208
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
209 (defcustom calculator-user-operators nil
100171
d42aff5ca541 * align.el:
Lute Kamstra <lute@gnu.org>
parents: 99899
diff changeset
210 "A list of additional operators.
27587
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
211 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
212 `calculator-operators', that you can use to bind additional calculator
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
213 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
214 `customize' since it is too complex...
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
215
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
216 Examples:
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
217
30889
5f9c434a6e88 (calculator): Add :version.
Dave Love <fx@gnu.org>
parents: 27904
diff changeset
218 * 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
219 t as a prefix key:
27587
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
220
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
221 (setq calculator-user-operators
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
222 '((\"tf\" cl-to-fr (+ 32 (/ (* X 9) 5)) 1)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
223 (\"tc\" fr-to-cl (/ (* (- X 32) 5) 9) 1)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
224 (\"tp\" kg-to-lb (/ X 0.453592) 1)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
225 (\"tk\" lb-to-kg (* X 0.453592) 1)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
226 (\"tF\" mt-to-ft (/ X 0.3048) 1)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
227 (\"tM\" ft-to-mt (* X 0.3048) 1)))
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 * 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
230 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
231 and F does a recursive call, Here is a [very inefficient] Fibonacci
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
232 number calculation:
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
233
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
234 (add-to-list 'calculator-user-operators
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
235 '(\"F\" fib (if (<= TX 1)
33491
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
236 1
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
237 (+ (F (- TX 1)) (F (- TX 2)))) 0))
27587
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 Note that this will be either postfix or prefix, according to
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
240 `calculator-unary-style'."
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
241 :type '(repeat (list string symbol sexp integer integer))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
242 :group 'calculator)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
243
33631
86ab384be9d7 New version from author.
Gerd Moellmann <gerd@gnu.org>
parents: 33551
diff changeset
244 ;;;=====================================================================
27587
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
245 ;;; Code:
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
246
33631
86ab384be9d7 New version from author.
Gerd Moellmann <gerd@gnu.org>
parents: 33551
diff changeset
247 ;;;---------------------------------------------------------------------
33491
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
248 ;;; Variables
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
249
27587
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
250 (defvar calculator-initial-operators
27904
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
251 '(;; "+"/"-" have keybindings of themselves, not calculator-ops
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
252 ("=" = identity 1 -1)
33491
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
253 (nobind "+" + + 2 4)
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
254 (nobind "-" - - 2 4)
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
255 (nobind "+" + + -1 9)
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
256 (nobind "-" - - -1 9)
27904
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
257 ("(" \( identity -1 -1)
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
258 (")" \) identity +1 10)
27587
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
259 ;; normal keys
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
260 ("|" or (logior TX TY) 2 2)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
261 ("#" xor (logxor TX TY) 2 2)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
262 ("&" and (logand TX TY) 2 3)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
263 ("*" * * 2 5)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
264 ("/" / / 2 5)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
265 ("\\" div (/ TX TY) 2 5)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
266 ("%" rem (% TX TY) 2 5)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
267 ("L" log log 2 6)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
268 ("S" sin (sin DX) x 6)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
269 ("C" cos (cos DX) x 6)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
270 ("T" tan (tan DX) x 6)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
271 ("IS" asin (D (asin X)) x 6)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
272 ("IC" acos (D (acos X)) x 6)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
273 ("IT" atan (D (atan X)) x 6)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
274 ("Q" sqrt sqrt x 7)
81696
c29faa83ba3a (calculator-expt, calculator-integer-p): New functions.
Jay Belanger <jay.p.belanger@gmail.com>
parents: 75773
diff changeset
275 ("^" ^ calculator-expt 2 7)
27587
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
276 ("!" ! calculator-fact x 7)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
277 (";" 1/ (/ 1 X) 1 7)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
278 ("_" - - 1 8)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
279 ("~" ~ (lognot TX) x 8)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
280 (">" repR calculator-repR 1 8)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
281 ("<" repL calculator-repL 1 8)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
282 ("v" avg (/ (apply '+ L) (length L)) 0 8)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
283 ("l" tot (apply '+ L) 0 8)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
284 )
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
285 "A list of initial operators.
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
286 This is a list in the same format as `calculator-operators'. Whenever
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
287 `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
288 is not empty, its contents is prepended to `calculator-operators' and
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
289 the appropriate key bindings are made.
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
290
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
291 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
292 user-defined operators, use `calculator-user-operators' instead.")
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
293
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
294 (defvar calculator-operators nil
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
295 "The calculator operators, each a list with:
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
296
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
297 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
298
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
299 2. The displayed symbol for this function;
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
300
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
301 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
302 (if it is a binary operator), `TX' and `TY' (truncated integer
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
303 versions), `DX' (converted to radians if degrees mode is on), `D'
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
304 (function for converting radians to degrees if deg mode is on), `L'
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
305 (list of saved values), `F' (function for recursive iteration calls)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
306 and evaluates to the function value - these variables are capital;
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
307
33491
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
308 4. The function's arity, optional, one of: 2 => binary, -1 => prefix
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
309 unary, +1 => postfix unary, 0 => a 0-arg operator func, non-number =>
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
310 postfix/prefix as determined by `calculator-unary-style' (the
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
311 default);
27587
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
312
33491
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
313 5. The function's precedence - should be in the range of 1 (lowest) to
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
314 9 (highest) (optional, defaults to 1);
27587
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
315
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
316 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
317 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
318 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
319 keys.
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
320
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
321 Use `calculator-user-operators' to add operators to this list, see its
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
322 documentation for an example.")
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
323
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
324 (defvar calculator-stack nil
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
325 "Stack contents - operations and operands.")
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
326
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
327 (defvar calculator-curnum nil
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
328 "Current number being entered (as a string).")
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
329
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
330 (defvar calculator-stack-display nil
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
331 "Cons of the stack and its string representation.")
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
332
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
333 (defvar calculator-char-radix
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
334 '((?D . nil) (?B . bin) (?O . oct) (?H . hex) (?X . hex))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
335 "A table to convert input characters to corresponding radix symbols.")
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
336
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
337 (defvar calculator-output-radix nil
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
338 "The mode for display, one of: nil (decimal), 'bin, 'oct or 'hex.")
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
339
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
340 (defvar calculator-input-radix nil
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
341 "The mode for input, one of: nil (decimal), 'bin, 'oct or 'hex.")
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
342
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
343 (defvar calculator-deg nil
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
344 "Non-nil if trig functions operate on degrees instead of radians.")
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
345
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
346 (defvar calculator-saved-list nil
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
347 "A list of saved values collected.")
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
348
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
349 (defvar calculator-saved-ptr 0
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
350 "The pointer to the current saved number.")
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
351
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
352 (defvar calculator-add-saved nil
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
353 "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
354
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
355 (defvar calculator-display-fragile nil
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
356 "When non-nil, we see something that the next digit should replace.")
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
357
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
358 (defvar calculator-buffer nil
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
359 "The current calculator buffer.")
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
360
33491
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
361 (defvar calculator-eng-extra nil
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
362 "Internal value used by `calculator-eng-display'.")
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
363
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
364 (defvar calculator-eng-tmp-show nil
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
365 "Internal value used by `calculator-eng-display'.")
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
366
27587
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
367 (defvar calculator-last-opXY nil
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
368 "The last binary operation and its arguments.
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
369 Used for repeating operations in calculator-repR/L.")
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
370
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
371 (defvar calculator-registers ; use user-bindings first
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
372 (append calculator-user-registers (list (cons ?e e) (cons ?p pi)))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
373 "The association list of calculator register values.")
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
374
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
375 (defvar calculator-saved-global-map nil
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
376 "Saved global key map.")
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
377
27904
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
378 (defvar calculator-restart-other-mode nil
33491
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
379 "Used to hack restarting with the electric mode changed.")
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
380
33631
86ab384be9d7 New version from author.
Gerd Moellmann <gerd@gnu.org>
parents: 33551
diff changeset
381 ;;;---------------------------------------------------------------------
33491
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
382 ;;; Key bindings
27904
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
383
27587
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
384 (defvar calculator-mode-map nil
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
385 "The calculator key map.")
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
386
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
387 (or calculator-mode-map
27904
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
388 (let ((map (make-sparse-keymap)))
27587
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
389 (suppress-keymap map t)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
390 (define-key map "i" nil)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
391 (define-key map "o" nil)
27904
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
392 (let ((p
33491
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
393 '((calculator-open-paren "[")
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
394 (calculator-close-paren "]")
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
395 (calculator-op-or-exp "+" "-" [kp-add] [kp-subtract])
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
396 (calculator-digit "0" "1" "2" "3" "4" "5" "6" "7" "8"
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
397 "9" "a" "b" "c" "d" "f"
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
398 [kp-0] [kp-1] [kp-2] [kp-3] [kp-4]
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
399 [kp-5] [kp-6] [kp-7] [kp-8] [kp-9])
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
400 (calculator-op [kp-divide] [kp-multiply])
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
401 (calculator-decimal "." [kp-decimal])
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
402 (calculator-exp "e")
27904
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
403 (calculator-dec/deg-mode "D")
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
404 (calculator-set-register "s")
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
405 (calculator-get-register "g")
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
406 (calculator-radix-mode "H" "X" "O" "B")
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
407 (calculator-radix-input-mode "id" "ih" "ix" "io" "ib"
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
408 "iD" "iH" "iX" "iO" "iB")
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
409 (calculator-radix-output-mode "od" "oh" "ox" "oo" "ob"
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
410 "oD" "oH" "oX" "oO" "oB")
33491
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
411 (calculator-rotate-displayer "'")
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
412 (calculator-rotate-displayer-back "\"")
59056
956483cc3659 (calculator-radix-grouping-mode)
Richard M. Stallman <rms@gnu.org>
parents: 52401
diff changeset
413 (calculator-displayer-prev "{")
39430
48633cf4ce7c (calculator-copy-displayer): New user-option.
Gerd Moellmann <gerd@gnu.org>
parents: 38436
diff changeset
414 (calculator-displayer-next "}")
27904
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
415 (calculator-saved-up [up] [?\C-p])
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
416 (calculator-saved-down [down] [?\C-n])
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
417 (calculator-quit "q" [?\C-g])
33491
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
418 (calculator-enter [enter] [linefeed] [kp-enter]
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
419 [return] [?\r] [?\n])
27904
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
420 (calculator-save-on-list " " [space])
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
421 (calculator-clear-saved [?\C-c] [(control delete)])
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
422 (calculator-save-and-quit [(control return)]
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
423 [(control kp-enter)])
33631
86ab384be9d7 New version from author.
Gerd Moellmann <gerd@gnu.org>
parents: 33551
diff changeset
424 (calculator-paste [insert] [(shift insert)]
59056
956483cc3659 (calculator-radix-grouping-mode)
Richard M. Stallman <rms@gnu.org>
parents: 52401
diff changeset
425 [paste] [mouse-2] [?\C-y])
27904
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
426 (calculator-clear [delete] [?\C-?] [?\C-d])
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
427 (calculator-help [?h] [??] [f1] [help])
59056
956483cc3659 (calculator-radix-grouping-mode)
Richard M. Stallman <rms@gnu.org>
parents: 52401
diff changeset
428 (calculator-copy [(control insert)] [copy])
27904
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
429 (calculator-backspace [backspace])
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
430 )))
27587
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
431 (while p
27904
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
432 ;; 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
433 ;; sensible bindings visible in the menu
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
434 (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
435 (while keys
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
436 (define-key map (car keys) func)
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
437 (setq keys (cdr keys))))
27587
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
438 (setq p (cdr p))))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
439 (if calculator-bind-escape
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
440 (progn (define-key map [?\e] 'calculator-quit)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
441 (define-key map [escape] 'calculator-quit))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
442 (define-key map [?\e ?\e ?\e] 'calculator-quit))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
443 ;; make C-h work in text-mode
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
444 (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
445 ;; set up a menu
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
446 (if (and calculator-use-menu (not (boundp 'calculator-menu)))
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
447 (let ((radix-selectors
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
448 (mapcar (lambda (x)
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
449 `([,(nth 0 x)
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
450 (calculator-radix-mode ,(nth 2 x))
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
451 :style radio
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
452 :keys ,(nth 2 x)
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
453 :selected
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
454 (and
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
455 (eq calculator-input-radix ',(nth 1 x))
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
456 (eq calculator-output-radix ',(nth 1 x)))]
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
457 [,(concat (nth 0 x) " Input")
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
458 (calculator-radix-input-mode ,(nth 2 x))
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
459 :keys ,(concat "i" (downcase (nth 2 x)))
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
460 :style radio
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
461 :selected
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
462 (eq calculator-input-radix ',(nth 1 x))]
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
463 [,(concat (nth 0 x) " Output")
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
464 (calculator-radix-output-mode ,(nth 2 x))
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
465 :keys ,(concat "o" (downcase (nth 2 x)))
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
466 :style radio
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
467 :selected
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
468 (eq calculator-output-radix ',(nth 1 x))]))
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
469 '(("Decimal" nil "D")
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
470 ("Binary" bin "B")
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
471 ("Octal" oct "O")
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
472 ("Hexadecimal" hex "H"))))
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
473 (op '(lambda (name key)
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
474 `[,name (calculator-op ,key) :keys ,key])))
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
475 (easy-menu-define
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
476 calculator-menu map "Calculator menu."
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
477 `("Calculator"
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
478 ["Help"
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
479 (let ((last-command 'calculator-help)) (calculator-help))
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
480 :keys "?"]
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
481 "---"
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
482 ["Copy" calculator-copy]
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
483 ["Paste" calculator-paste]
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
484 "---"
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
485 ["Electric mode"
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
486 (progn (calculator-quit)
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
487 (setq calculator-restart-other-mode t)
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
488 (run-with-timer 0.1 nil '(lambda () (message nil)))
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
489 ;; the message from the menu will be visible,
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
490 ;; couldn't make it go away...
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
491 (calculator))
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
492 :active (not calculator-electric-mode)]
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
493 ["Normal mode"
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
494 (progn (setq calculator-restart-other-mode t)
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
495 (calculator-quit))
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
496 :active calculator-electric-mode]
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
497 "---"
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
498 ("Functions"
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
499 ,(funcall op "Repeat-right" ">")
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
500 ,(funcall op "Repeat-left" "<")
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
501 "------General------"
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
502 ,(funcall op "Reciprocal" ";")
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
503 ,(funcall op "Log" "L")
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
504 ,(funcall op "Square-root" "Q")
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
505 ,(funcall op "Factorial" "!")
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
506 "------Trigonometric------"
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
507 ,(funcall op "Sinus" "S")
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
508 ,(funcall op "Cosine" "C")
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
509 ,(funcall op "Tangent" "T")
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
510 ,(funcall op "Inv-Sinus" "IS")
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
511 ,(funcall op "Inv-Cosine" "IC")
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
512 ,(funcall op "Inv-Tangent" "IT")
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
513 "------Bitwise------"
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
514 ,(funcall op "Or" "|")
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
515 ,(funcall op "Xor" "#")
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
516 ,(funcall op "And" "&")
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
517 ,(funcall op "Not" "~"))
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
518 ("Saved List"
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
519 ["Eval+Save" calculator-save-on-list]
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
520 ["Prev number" calculator-saved-up]
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
521 ["Next number" calculator-saved-down]
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
522 ["Delete current" calculator-clear
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
523 :active (and calculator-display-fragile
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
524 calculator-saved-list
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
525 (= (car calculator-stack)
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
526 (nth calculator-saved-ptr
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
527 calculator-saved-list)))]
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
528 ["Delete all" calculator-clear-saved]
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
529 "---"
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
530 ,(funcall op "List-total" "l")
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
531 ,(funcall op "List-average" "v"))
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
532 ("Registers"
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
533 ["Get register" calculator-get-register]
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
534 ["Set register" calculator-set-register])
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
535 ("Modes"
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
536 ["Radians"
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
537 (progn
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
538 (and (or calculator-input-radix calculator-output-radix)
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
539 (calculator-radix-mode "D"))
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
540 (and calculator-deg (calculator-dec/deg-mode)))
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
541 :keys "D"
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
542 :style radio
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
543 :selected (not (or calculator-input-radix
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
544 calculator-output-radix
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
545 calculator-deg))]
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
546 ["Degrees"
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
547 (progn
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
548 (and (or calculator-input-radix calculator-output-radix)
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
549 (calculator-radix-mode "D"))
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
550 (or calculator-deg (calculator-dec/deg-mode)))
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
551 :keys "D"
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
552 :style radio
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
553 :selected (and calculator-deg
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
554 (not (or calculator-input-radix
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
555 calculator-output-radix)))]
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
556 "---"
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
557 ,@(mapcar 'car radix-selectors)
75773
8344ba1076b6 (calculator-mode-map): Fix typo in menu entry.
Juanma Barranquero <lekktu@gmail.com>
parents: 75762
diff changeset
558 ("Separate I/O"
27904
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
559 ,@(mapcar (lambda (x) (nth 1 x)) radix-selectors)
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
560 "---"
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
561 ,@(mapcar (lambda (x) (nth 2 x)) radix-selectors)))
59056
956483cc3659 (calculator-radix-grouping-mode)
Richard M. Stallman <rms@gnu.org>
parents: 52401
diff changeset
562 ("Decimal Display"
33491
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
563 ,@(mapcar (lambda (d)
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
564 (vector (cadr d)
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
565 ;; Note: inserts actual object here
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
566 `(calculator-rotate-displayer ',d)))
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
567 calculator-displayers)
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
568 "---"
39430
48633cf4ce7c (calculator-copy-displayer): New user-option.
Gerd Moellmann <gerd@gnu.org>
parents: 38436
diff changeset
569 ["Change Prev Display" calculator-displayer-prev]
48633cf4ce7c (calculator-copy-displayer): New user-option.
Gerd Moellmann <gerd@gnu.org>
parents: 38436
diff changeset
570 ["Change Next Display" calculator-displayer-next])
27904
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
571 "---"
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
572 ["Copy+Quit" calculator-save-and-quit]
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
573 ["Quit" calculator-quit]))))
27587
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
574 (setq calculator-mode-map map)))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
575
33631
86ab384be9d7 New version from author.
Gerd Moellmann <gerd@gnu.org>
parents: 33551
diff changeset
576 ;;;---------------------------------------------------------------------
33491
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
577 ;;; Startup and mode stuff
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
578
27587
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
579 (defun calculator-mode ()
33491
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
580 ;; this help is also used as the major help screen
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
581 "A [not so] simple calculator for Emacs.
27587
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
582
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
583 This calculator is used in the same way as other popular calculators
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
584 like xcalc or calc.exe - but using an Emacs interface.
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
585
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
586 Expressions are entered using normal infix notation, parens are used as
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
587 normal. Unary functions are usually postfix, but some depends on the
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
588 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
589 specified, then it is fixed, otherwise it depends on this variable).
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
590 `+' and `-' can be used as either binary operators or prefix unary
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
591 operators. Numbers can be entered with exponential notation using `e',
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
592 except when using a non-decimal radix mode for input (in this case `e'
81696
c29faa83ba3a (calculator-expt, calculator-integer-p): New functions.
Jay Belanger <jay.p.belanger@gmail.com>
parents: 75773
diff changeset
593 will be the hexadecimal digit). If the result of a calculation is too
c29faa83ba3a (calculator-expt, calculator-integer-p): New functions.
Jay Belanger <jay.p.belanger@gmail.com>
parents: 75773
diff changeset
594 large (out of range for Emacs), the value of \"inf\" is returned.
27587
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
595
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
596 Here are the editing keys:
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
597 * `RET' `=' evaluate the current expression
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
598 * `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
599 * `C-return' evaluate, save result the `kill-ring' and exit
27587
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
600 * `insert' paste a number if the one was copied (normally)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
601 * `delete' `C-d' clear last argument or whole expression (hit twice)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
602 * `backspace' delete a digit or a previous expression element
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
603 * `h' `?' pop-up a quick reference help
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
604 * `ESC' `q' exit (`ESC' can be used if `calculator-bind-escape' is
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
605 non-nil, otherwise use three consecutive `ESC's)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
606
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
607 These operators are pre-defined:
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
608 * `+' `-' `*' `/' the common binary operators
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
609 * `\\' `%' integer division and reminder
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
610 * `_' `;' postfix unary negation and reciprocal
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
611 * `^' `L' binary operators for x^y and log(x) in base y
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
612 * `Q' `!' unary square root and factorial
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
613 * `S' `C' `T' unary trigonometric operators - sin, cos and tan
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
614 * `|' `#' `&' `~' bitwise operators - or, xor, and, not
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
615
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
616 The trigonometric functions can be inverted if prefixed with an `I', see
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
617 below for the way to use degrees instead of the default radians.
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
618
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
619 Two special postfix unary operators are `>' and `<': whenever a binary
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
620 operator is performed, it is remembered along with its arguments; then
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
621 `>' (`<') will apply the same operator with the same right (left)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
622 argument.
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
623
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
624 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
625 Another toggle-able mode is for using degrees instead of radians for
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
626 trigonometric functions.
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
627 The keys to switch modes are (`X' is shortcut for `H'):
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
628 * `D' switch to all-decimal mode, or toggle degrees/radians
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
629 * `B' `O' `H' `X' binary/octal/hexadecimal modes for input & display
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
630 * `i' `o' followed by one of `D' `B' `O' `H' `X' (case
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
631 insensitive) sets only the input or display radix mode
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
632 The prompt indicates the current modes:
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
633 * \"D=\": degrees mode;
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
634 * \"?=\": (? 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
635 * \"=?\": (? is B/O/H) the display radix (when input is decimal);
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
636 * \"??\": (? 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
637
59056
956483cc3659 (calculator-radix-grouping-mode)
Richard M. Stallman <rms@gnu.org>
parents: 52401
diff changeset
638 Also, the quote key can be used to switch display modes for decimal
956483cc3659 (calculator-radix-grouping-mode)
Richard M. Stallman <rms@gnu.org>
parents: 52401
diff changeset
639 numbers (double-quote rotates back), and the two brace characters
956483cc3659 (calculator-radix-grouping-mode)
Richard M. Stallman <rms@gnu.org>
parents: 52401
diff changeset
640 \(\"{\" and \"}\" change display parameters that these displayers use (if
956483cc3659 (calculator-radix-grouping-mode)
Richard M. Stallman <rms@gnu.org>
parents: 52401
diff changeset
641 they handle such). If output is using any radix mode, then these keys
956483cc3659 (calculator-radix-grouping-mode)
Richard M. Stallman <rms@gnu.org>
parents: 52401
diff changeset
642 toggle digit grouping mode and the chunk size.
33491
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
643
27587
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
644 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
645 values, or in registers.
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
646
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
647 The list of saved values is useful for statistics operations on some
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
648 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
649 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
650 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
651 \"[M/N]\" if the M-th value is shown.
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
652 * `SPC' evaluate the current value as usual, but also adds
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
653 the result to the list of saved values
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
654 * `l' `v' computes total / average of saved values
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
655 * `up' `C-p' browse to the previous value in the list
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
656 * `down' `C-n' browse to the next value in the list
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
657 * `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
658 * `C-delete' `C-c' delete the whole list
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 Registers are variable-like place-holders for values:
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
661 * `s' followed by a character attach the current value to that character
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
662 * `g' followed by a character fetches the attached value
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
663
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
664 There are many variables that can be used to customize the calculator.
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
665 Some interesting customization variables are:
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
666 * `calculator-electric-mode' use only the echo-area electrically.
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
667 * `calculator-unary-style' set most unary ops to pre/postfix style.
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
668 * `calculator-user-registers' to define user-preset registers.
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
669 * `calculator-user-operators' to add user-defined operators.
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
670 See the documentation for these variables, and \"calculator.el\" for
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
671 more information.
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
672
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
673 \\{calculator-mode-map}"
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
674 (interactive)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
675 (kill-all-local-variables)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
676 (setq major-mode 'calculator-mode)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
677 (setq mode-name "Calculator")
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
678 (use-local-map calculator-mode-map)
62720
eb01420c0088 (calculator-mode): Use run-mode-hooks.
Lute Kamstra <lute@gnu.org>
parents: 62531
diff changeset
679 (run-mode-hooks 'calculator-mode-hook))
27587
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
680
33491
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
681 (eval-when-compile (require 'electric) (require 'ehelp))
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
682
27587
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
683 ;;;###autoload
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
684 (defun calculator ()
33491
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
685 "Run the Emacs calculator.
27587
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
686 See the documentation for `calculator-mode' for more information."
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
687 (interactive)
27904
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
688 (if calculator-restart-other-mode
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
689 (setq calculator-electric-mode (not calculator-electric-mode)))
27587
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
690 (if calculator-initial-operators
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
691 (progn (calculator-add-operators calculator-initial-operators)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
692 (setq calculator-initial-operators nil)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
693 ;; don't change this since it is a customization variable,
33491
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
694 ;; its set function will add any new operators
27587
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
695 (calculator-add-operators calculator-user-operators)))
49575
336c18b62203 (calculator): Don't use the minibuffer even in electric mode; use a private
Juanma Barranquero <lekktu@gmail.com>
parents: 43091
diff changeset
696 (setq calculator-buffer (get-buffer-create "*calculator*"))
27587
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
697 (if calculator-electric-mode
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
698 (save-window-excursion
27904
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
699 (progn (require 'electric) (message nil)) ; hide load message
27587
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
700 (let (old-g-map old-l-map (echo-keystrokes 0)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
701 (garbage-collection-messages nil)) ; no gc msg when electric
49575
336c18b62203 (calculator): Don't use the minibuffer even in electric mode; use a private
Juanma Barranquero <lekktu@gmail.com>
parents: 43091
diff changeset
702 (set-window-buffer (minibuffer-window) calculator-buffer)
27587
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
703 (select-window (minibuffer-window))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
704 (calculator-reset)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
705 (calculator-update-display)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
706 (setq old-l-map (current-local-map))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
707 (setq old-g-map (current-global-map))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
708 (setq calculator-saved-global-map (current-global-map))
27904
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
709 (use-local-map nil)
27587
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
710 (use-global-map calculator-mode-map)
59056
956483cc3659 (calculator-radix-grouping-mode)
Richard M. Stallman <rms@gnu.org>
parents: 52401
diff changeset
711 (run-hooks 'calculator-mode-hook)
27587
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
712 (unwind-protect
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
713 (catch 'calculator-done
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
714 (Electric-command-loop
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
715 'calculator-done
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
716 ;; can't use 'noprompt, bug in electric.el
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
717 '(lambda () 'noprompt)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
718 nil
27904
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
719 (lambda (x y) (calculator-update-display))))
27587
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
720 (and calculator-buffer
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
721 (catch 'calculator-done (calculator-quit)))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
722 (use-local-map old-l-map)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
723 (use-global-map old-g-map))))
27904
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
724 (progn
39430
48633cf4ce7c (calculator-copy-displayer): New user-option.
Gerd Moellmann <gerd@gnu.org>
parents: 38436
diff changeset
725 (cond
48633cf4ce7c (calculator-copy-displayer): New user-option.
Gerd Moellmann <gerd@gnu.org>
parents: 38436
diff changeset
726 ((not (get-buffer-window calculator-buffer))
107342
176028ab9fc6 * calculator.el (calculator): Don't bind split-window-keep-point (Bug#5674).
Chong Yidong <cyd@stupidchicken.com>
parents: 106815
diff changeset
727 (let ((window-min-height 2))
39430
48633cf4ce7c (calculator-copy-displayer): New user-option.
Gerd Moellmann <gerd@gnu.org>
parents: 38436
diff changeset
728 ;; maybe leave two lines for our window because of the normal
48633cf4ce7c (calculator-copy-displayer): New user-option.
Gerd Moellmann <gerd@gnu.org>
parents: 38436
diff changeset
729 ;; `raised' modeline in Emacs 21
48633cf4ce7c (calculator-copy-displayer): New user-option.
Gerd Moellmann <gerd@gnu.org>
parents: 38436
diff changeset
730 (select-window
48633cf4ce7c (calculator-copy-displayer): New user-option.
Gerd Moellmann <gerd@gnu.org>
parents: 38436
diff changeset
731 (split-window-vertically
75757
fa4ebb68ab30 (calculator): Do more extensive checking for when 3 lines should be
Jay Belanger <jay.p.belanger@gmail.com>
parents: 75347
diff changeset
732 ;; If the modeline might interfere with the calculator buffer,
75773
8344ba1076b6 (calculator-mode-map): Fix typo in menu entry.
Juanma Barranquero <lekktu@gmail.com>
parents: 75762
diff changeset
733 ;; use 3 lines instead.
39430
48633cf4ce7c (calculator-copy-displayer): New user-option.
Gerd Moellmann <gerd@gnu.org>
parents: 38436
diff changeset
734 (if (and (fboundp 'face-attr-construct)
75762
a57328de9ea2 (calculator): Adjust previous adjustment.
Jay Belanger <jay.p.belanger@gmail.com>
parents: 75757
diff changeset
735 (let* ((dh (plist-get (face-attr-construct 'default) :height))
a57328de9ea2 (calculator): Adjust previous adjustment.
Jay Belanger <jay.p.belanger@gmail.com>
parents: 75757
diff changeset
736 (mf (face-attr-construct 'modeline))
a57328de9ea2 (calculator): Adjust previous adjustment.
Jay Belanger <jay.p.belanger@gmail.com>
parents: 75757
diff changeset
737 (mh (plist-get mf :height)))
75773
8344ba1076b6 (calculator-mode-map): Fix typo in menu entry.
Juanma Barranquero <lekktu@gmail.com>
parents: 75762
diff changeset
738 ;; If the modeline is shorter than the default,
8344ba1076b6 (calculator-mode-map): Fix typo in menu entry.
Juanma Barranquero <lekktu@gmail.com>
parents: 75762
diff changeset
739 ;; stick with 2 lines. (It may be necessary to
75762
a57328de9ea2 (calculator): Adjust previous adjustment.
Jay Belanger <jay.p.belanger@gmail.com>
parents: 75757
diff changeset
740 ;; check how much shorter.)
a57328de9ea2 (calculator): Adjust previous adjustment.
Jay Belanger <jay.p.belanger@gmail.com>
parents: 75757
diff changeset
741 (and
a57328de9ea2 (calculator): Adjust previous adjustment.
Jay Belanger <jay.p.belanger@gmail.com>
parents: 75757
diff changeset
742 (not
a57328de9ea2 (calculator): Adjust previous adjustment.
Jay Belanger <jay.p.belanger@gmail.com>
parents: 75757
diff changeset
743 (or (and (integerp dh)
a57328de9ea2 (calculator): Adjust previous adjustment.
Jay Belanger <jay.p.belanger@gmail.com>
parents: 75757
diff changeset
744 (integerp mh)
a57328de9ea2 (calculator): Adjust previous adjustment.
Jay Belanger <jay.p.belanger@gmail.com>
parents: 75757
diff changeset
745 (< mh dh))
a57328de9ea2 (calculator): Adjust previous adjustment.
Jay Belanger <jay.p.belanger@gmail.com>
parents: 75757
diff changeset
746 (and (numberp mh)
a57328de9ea2 (calculator): Adjust previous adjustment.
Jay Belanger <jay.p.belanger@gmail.com>
parents: 75757
diff changeset
747 (not (integerp mh))
a57328de9ea2 (calculator): Adjust previous adjustment.
Jay Belanger <jay.p.belanger@gmail.com>
parents: 75757
diff changeset
748 (< mh 1))))
a57328de9ea2 (calculator): Adjust previous adjustment.
Jay Belanger <jay.p.belanger@gmail.com>
parents: 75757
diff changeset
749 (or
a57328de9ea2 (calculator): Adjust previous adjustment.
Jay Belanger <jay.p.belanger@gmail.com>
parents: 75757
diff changeset
750 ;; If the modeline is taller than the default,
a57328de9ea2 (calculator): Adjust previous adjustment.
Jay Belanger <jay.p.belanger@gmail.com>
parents: 75757
diff changeset
751 ;; use 3 lines.
a57328de9ea2 (calculator): Adjust previous adjustment.
Jay Belanger <jay.p.belanger@gmail.com>
parents: 75757
diff changeset
752 (and (integerp dh)
a57328de9ea2 (calculator): Adjust previous adjustment.
Jay Belanger <jay.p.belanger@gmail.com>
parents: 75757
diff changeset
753 (integerp mh)
a57328de9ea2 (calculator): Adjust previous adjustment.
Jay Belanger <jay.p.belanger@gmail.com>
parents: 75757
diff changeset
754 (> mh dh))
a57328de9ea2 (calculator): Adjust previous adjustment.
Jay Belanger <jay.p.belanger@gmail.com>
parents: 75757
diff changeset
755 (and (numberp mh)
a57328de9ea2 (calculator): Adjust previous adjustment.
Jay Belanger <jay.p.belanger@gmail.com>
parents: 75757
diff changeset
756 (not (integerp mh))
a57328de9ea2 (calculator): Adjust previous adjustment.
Jay Belanger <jay.p.belanger@gmail.com>
parents: 75757
diff changeset
757 (> mh 1))
a57328de9ea2 (calculator): Adjust previous adjustment.
Jay Belanger <jay.p.belanger@gmail.com>
parents: 75757
diff changeset
758 ;; If the modeline has a box with non-negative line-width,
a57328de9ea2 (calculator): Adjust previous adjustment.
Jay Belanger <jay.p.belanger@gmail.com>
parents: 75757
diff changeset
759 ;; use 3 lines.
a57328de9ea2 (calculator): Adjust previous adjustment.
Jay Belanger <jay.p.belanger@gmail.com>
parents: 75757
diff changeset
760 (let* ((bx (plist-get mf :box))
a57328de9ea2 (calculator): Adjust previous adjustment.
Jay Belanger <jay.p.belanger@gmail.com>
parents: 75757
diff changeset
761 (lh (plist-get bx :line-width)))
a57328de9ea2 (calculator): Adjust previous adjustment.
Jay Belanger <jay.p.belanger@gmail.com>
parents: 75757
diff changeset
762 (and bx
75773
8344ba1076b6 (calculator-mode-map): Fix typo in menu entry.
Juanma Barranquero <lekktu@gmail.com>
parents: 75762
diff changeset
763 (or
75762
a57328de9ea2 (calculator): Adjust previous adjustment.
Jay Belanger <jay.p.belanger@gmail.com>
parents: 75757
diff changeset
764 (not lh)
a57328de9ea2 (calculator): Adjust previous adjustment.
Jay Belanger <jay.p.belanger@gmail.com>
parents: 75757
diff changeset
765 (> lh 0))))
a57328de9ea2 (calculator): Adjust previous adjustment.
Jay Belanger <jay.p.belanger@gmail.com>
parents: 75757
diff changeset
766 ;; If the modeline has an overline, use 3 lines.
a57328de9ea2 (calculator): Adjust previous adjustment.
Jay Belanger <jay.p.belanger@gmail.com>
parents: 75757
diff changeset
767 (plist-get (face-attr-construct 'modeline) :overline)))))
39430
48633cf4ce7c (calculator-copy-displayer): New user-option.
Gerd Moellmann <gerd@gnu.org>
parents: 38436
diff changeset
768 -3 -2)))
48633cf4ce7c (calculator-copy-displayer): New user-option.
Gerd Moellmann <gerd@gnu.org>
parents: 38436
diff changeset
769 (switch-to-buffer calculator-buffer)))
48633cf4ce7c (calculator-copy-displayer): New user-option.
Gerd Moellmann <gerd@gnu.org>
parents: 38436
diff changeset
770 ((not (eq (current-buffer) calculator-buffer))
48633cf4ce7c (calculator-copy-displayer): New user-option.
Gerd Moellmann <gerd@gnu.org>
parents: 38436
diff changeset
771 (select-window (get-buffer-window calculator-buffer))))
27904
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
772 (calculator-mode)
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
773 (setq buffer-read-only t)
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
774 (calculator-reset)
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
775 (message "Hit `?' For a quick help screen.")))
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
776 (if (and calculator-restart-other-mode calculator-electric-mode)
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
777 (calculator)))
27587
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
778
59056
956483cc3659 (calculator-radix-grouping-mode)
Richard M. Stallman <rms@gnu.org>
parents: 52401
diff changeset
779 (defun calculator-message (string &rest arguments)
956483cc3659 (calculator-radix-grouping-mode)
Richard M. Stallman <rms@gnu.org>
parents: 52401
diff changeset
780 "Same as `message', but special handle of electric mode."
956483cc3659 (calculator-radix-grouping-mode)
Richard M. Stallman <rms@gnu.org>
parents: 52401
diff changeset
781 (apply 'message string arguments)
956483cc3659 (calculator-radix-grouping-mode)
Richard M. Stallman <rms@gnu.org>
parents: 52401
diff changeset
782 (if calculator-electric-mode
956483cc3659 (calculator-radix-grouping-mode)
Richard M. Stallman <rms@gnu.org>
parents: 52401
diff changeset
783 (progn (sit-for 1) (message nil))))
956483cc3659 (calculator-radix-grouping-mode)
Richard M. Stallman <rms@gnu.org>
parents: 52401
diff changeset
784
33631
86ab384be9d7 New version from author.
Gerd Moellmann <gerd@gnu.org>
parents: 33551
diff changeset
785 ;;;---------------------------------------------------------------------
43091
f18f05d77411 (calculator-displayers): Doc fixes.
Pavel Janík <Pavel@Janik.cz>
parents: 39818
diff changeset
786 ;;; Operators
33491
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
787
27587
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
788 (defun calculator-op-arity (op)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
789 "Return OP's arity, 2, +1 or -1."
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
790 (let ((arity (or (nth 3 op) 'x)))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
791 (if (numberp arity)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
792 arity
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
793 (if (eq calculator-unary-style 'postfix) +1 -1))))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
794
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
795 (defun calculator-op-prec (op)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
796 "Return OP's precedence for reducing when inserting into the stack.
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
797 Defaults to 1."
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
798 (or (nth 4 op) 1))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
799
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
800 (defun calculator-add-operators (more-ops)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
801 "This function handles operator addition.
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
802 Adds MORE-OPS to `calculator-operator', called initially to handle
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
803 `calculator-initial-operators' and `calculator-user-operators'."
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
804 (let ((added-ops nil))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
805 (while more-ops
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
806 (or (eq (car (car more-ops)) 'nobind)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
807 (let ((i -1) (key (car (car more-ops))))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
808 ;; make sure the key is undefined, so it's easy to define
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
809 ;; prefix keys
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
810 (while (< (setq i (1+ i)) (length key))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
811 (or (keymapp
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
812 (lookup-key calculator-mode-map
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
813 (substring key 0 (1+ i))))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
814 (progn
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
815 (define-key
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
816 calculator-mode-map (substring key 0 (1+ i)) nil)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
817 (setq i (length key)))))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
818 (define-key calculator-mode-map key 'calculator-op)))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
819 (setq added-ops (cons (if (eq (car (car more-ops)) 'nobind)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
820 (cdr (car more-ops))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
821 (car more-ops))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
822 added-ops))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
823 (setq more-ops (cdr more-ops)))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
824 ;; added-ops come first, but in correct order
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
825 (setq calculator-operators
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
826 (append (nreverse added-ops) calculator-operators))))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
827
33631
86ab384be9d7 New version from author.
Gerd Moellmann <gerd@gnu.org>
parents: 33551
diff changeset
828 ;;;---------------------------------------------------------------------
33491
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
829 ;;; Display stuff
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
830
27587
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
831 (defun calculator-reset ()
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
832 "Reset calculator variables."
27904
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
833 (or calculator-restart-other-mode
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
834 (setq calculator-stack nil
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
835 calculator-curnum nil
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
836 calculator-stack-display nil
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
837 calculator-display-fragile nil))
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
838 (setq calculator-restart-other-mode nil)
27587
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
839 (calculator-update-display))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
840
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
841 (defun calculator-get-prompt ()
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
842 "Return a string to display.
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
843 The string is set not to exceed the screen width."
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
844 (let* ((calculator-prompt
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
845 (format calculator-prompt
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
846 (cond
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
847 ((or calculator-output-radix calculator-input-radix)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
848 (if (eq calculator-output-radix
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
849 calculator-input-radix)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
850 (concat
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
851 (char-to-string
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
852 (car (rassq calculator-output-radix
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
853 calculator-char-radix)))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
854 "=")
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
855 (concat
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
856 (if calculator-input-radix
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
857 (char-to-string
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
858 (car (rassq calculator-input-radix
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
859 calculator-char-radix)))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
860 "=")
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
861 (char-to-string
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
862 (car (rassq calculator-output-radix
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
863 calculator-char-radix))))))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
864 (calculator-deg "D=")
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
865 (t "=="))))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
866 (prompt
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
867 (concat calculator-prompt
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
868 (cdr calculator-stack-display)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
869 (cond (calculator-curnum
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
870 ;; number being typed
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
871 (concat calculator-curnum "_"))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
872 ((and (= 1 (length calculator-stack))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
873 calculator-display-fragile)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
874 ;; only the result is shown, next number will
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
875 ;; restart
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
876 nil)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
877 (t
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
878 ;; waiting for a number or an operator
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
879 "?"))))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
880 (trim (- (length prompt) (1- (window-width)))))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
881 (if (<= trim 0)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
882 prompt
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
883 (concat calculator-prompt
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
884 (substring prompt (+ trim (length calculator-prompt)))))))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
885
59056
956483cc3659 (calculator-radix-grouping-mode)
Richard M. Stallman <rms@gnu.org>
parents: 52401
diff changeset
886 (defun calculator-string-to-number (str)
956483cc3659 (calculator-radix-grouping-mode)
Richard M. Stallman <rms@gnu.org>
parents: 52401
diff changeset
887 "Convert the given STR to a number, according to the value of
956483cc3659 (calculator-radix-grouping-mode)
Richard M. Stallman <rms@gnu.org>
parents: 52401
diff changeset
888 `calculator-input-radix'."
27587
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
889 (if calculator-input-radix
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
890 (let ((radix
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
891 (cdr (assq calculator-input-radix
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
892 '((bin . 2) (oct . 8) (hex . 16)))))
59056
956483cc3659 (calculator-radix-grouping-mode)
Richard M. Stallman <rms@gnu.org>
parents: 52401
diff changeset
893 (i -1) (value 0) (new-value 0))
956483cc3659 (calculator-radix-grouping-mode)
Richard M. Stallman <rms@gnu.org>
parents: 52401
diff changeset
894 ;; assume mostly valid input (e.g., characters in range)
956483cc3659 (calculator-radix-grouping-mode)
Richard M. Stallman <rms@gnu.org>
parents: 52401
diff changeset
895 (while (< (setq i (1+ i)) (length str))
956483cc3659 (calculator-radix-grouping-mode)
Richard M. Stallman <rms@gnu.org>
parents: 52401
diff changeset
896 (setq new-value
956483cc3659 (calculator-radix-grouping-mode)
Richard M. Stallman <rms@gnu.org>
parents: 52401
diff changeset
897 (let* ((ch (upcase (aref str i)))
956483cc3659 (calculator-radix-grouping-mode)
Richard M. Stallman <rms@gnu.org>
parents: 52401
diff changeset
898 (n (cond ((< ch ?0) nil)
956483cc3659 (calculator-radix-grouping-mode)
Richard M. Stallman <rms@gnu.org>
parents: 52401
diff changeset
899 ((<= ch ?9) (- ch ?0))
956483cc3659 (calculator-radix-grouping-mode)
Richard M. Stallman <rms@gnu.org>
parents: 52401
diff changeset
900 ((< ch ?A) nil)
956483cc3659 (calculator-radix-grouping-mode)
Richard M. Stallman <rms@gnu.org>
parents: 52401
diff changeset
901 ((<= ch ?Z) (- ch (- ?A 10)))
956483cc3659 (calculator-radix-grouping-mode)
Richard M. Stallman <rms@gnu.org>
parents: 52401
diff changeset
902 (t nil))))
956483cc3659 (calculator-radix-grouping-mode)
Richard M. Stallman <rms@gnu.org>
parents: 52401
diff changeset
903 (if (and n (<= 0 n) (< n radix))
956483cc3659 (calculator-radix-grouping-mode)
Richard M. Stallman <rms@gnu.org>
parents: 52401
diff changeset
904 (+ n (* radix value))
956483cc3659 (calculator-radix-grouping-mode)
Richard M. Stallman <rms@gnu.org>
parents: 52401
diff changeset
905 (progn
956483cc3659 (calculator-radix-grouping-mode)
Richard M. Stallman <rms@gnu.org>
parents: 52401
diff changeset
906 (calculator-message
956483cc3659 (calculator-radix-grouping-mode)
Richard M. Stallman <rms@gnu.org>
parents: 52401
diff changeset
907 "Warning: Ignoring bad input character `%c'." ch)
956483cc3659 (calculator-radix-grouping-mode)
Richard M. Stallman <rms@gnu.org>
parents: 52401
diff changeset
908 (sit-for 1)
956483cc3659 (calculator-radix-grouping-mode)
Richard M. Stallman <rms@gnu.org>
parents: 52401
diff changeset
909 value))))
956483cc3659 (calculator-radix-grouping-mode)
Richard M. Stallman <rms@gnu.org>
parents: 52401
diff changeset
910 (if (if (< new-value 0) (> value 0) (< value 0))
956483cc3659 (calculator-radix-grouping-mode)
Richard M. Stallman <rms@gnu.org>
parents: 52401
diff changeset
911 (calculator-message "Warning: Overflow in input."))
956483cc3659 (calculator-radix-grouping-mode)
Richard M. Stallman <rms@gnu.org>
parents: 52401
diff changeset
912 (setq value new-value))
27587
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
913 value)
59056
956483cc3659 (calculator-radix-grouping-mode)
Richard M. Stallman <rms@gnu.org>
parents: 52401
diff changeset
914 (car (read-from-string
956483cc3659 (calculator-radix-grouping-mode)
Richard M. Stallman <rms@gnu.org>
parents: 52401
diff changeset
915 (cond ((equal "." str) "0.0")
956483cc3659 (calculator-radix-grouping-mode)
Richard M. Stallman <rms@gnu.org>
parents: 52401
diff changeset
916 ((string-match "[eE][+-]?$" str) (concat str "0"))
956483cc3659 (calculator-radix-grouping-mode)
Richard M. Stallman <rms@gnu.org>
parents: 52401
diff changeset
917 ((string-match "\\.[0-9]\\|[eE]" str) str)
956483cc3659 (calculator-radix-grouping-mode)
Richard M. Stallman <rms@gnu.org>
parents: 52401
diff changeset
918 ((string-match "\\." str)
956483cc3659 (calculator-radix-grouping-mode)
Richard M. Stallman <rms@gnu.org>
parents: 52401
diff changeset
919 ;; do this because Emacs reads "23." as an integer
956483cc3659 (calculator-radix-grouping-mode)
Richard M. Stallman <rms@gnu.org>
parents: 52401
diff changeset
920 (concat str "0"))
956483cc3659 (calculator-radix-grouping-mode)
Richard M. Stallman <rms@gnu.org>
parents: 52401
diff changeset
921 ((stringp str) (concat str ".0"))
956483cc3659 (calculator-radix-grouping-mode)
Richard M. Stallman <rms@gnu.org>
parents: 52401
diff changeset
922 (t "0.0"))))))
956483cc3659 (calculator-radix-grouping-mode)
Richard M. Stallman <rms@gnu.org>
parents: 52401
diff changeset
923
956483cc3659 (calculator-radix-grouping-mode)
Richard M. Stallman <rms@gnu.org>
parents: 52401
diff changeset
924 (defun calculator-curnum-value ()
956483cc3659 (calculator-radix-grouping-mode)
Richard M. Stallman <rms@gnu.org>
parents: 52401
diff changeset
925 "Get the numeric value of the displayed number string as a float."
956483cc3659 (calculator-radix-grouping-mode)
Richard M. Stallman <rms@gnu.org>
parents: 52401
diff changeset
926 (calculator-string-to-number calculator-curnum))
27587
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
927
33491
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
928 (defun calculator-rotate-displayer (&optional new-disp)
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
929 "Switch to the next displayer on the `calculator-displayers' list.
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
930 Can be called with an optional argument NEW-DISP to force rotation to
59056
956483cc3659 (calculator-radix-grouping-mode)
Richard M. Stallman <rms@gnu.org>
parents: 52401
diff changeset
931 that argument.
956483cc3659 (calculator-radix-grouping-mode)
Richard M. Stallman <rms@gnu.org>
parents: 52401
diff changeset
932 If radix output mode is active, toggle digit grouping."
33491
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
933 (interactive)
59056
956483cc3659 (calculator-radix-grouping-mode)
Richard M. Stallman <rms@gnu.org>
parents: 52401
diff changeset
934 (cond
956483cc3659 (calculator-radix-grouping-mode)
Richard M. Stallman <rms@gnu.org>
parents: 52401
diff changeset
935 (calculator-output-radix
956483cc3659 (calculator-radix-grouping-mode)
Richard M. Stallman <rms@gnu.org>
parents: 52401
diff changeset
936 (setq calculator-radix-grouping-mode
956483cc3659 (calculator-radix-grouping-mode)
Richard M. Stallman <rms@gnu.org>
parents: 52401
diff changeset
937 (not calculator-radix-grouping-mode))
956483cc3659 (calculator-radix-grouping-mode)
Richard M. Stallman <rms@gnu.org>
parents: 52401
diff changeset
938 (calculator-message
956483cc3659 (calculator-radix-grouping-mode)
Richard M. Stallman <rms@gnu.org>
parents: 52401
diff changeset
939 "Digit grouping mode %s."
956483cc3659 (calculator-radix-grouping-mode)
Richard M. Stallman <rms@gnu.org>
parents: 52401
diff changeset
940 (if calculator-radix-grouping-mode "ON" "OFF")))
956483cc3659 (calculator-radix-grouping-mode)
Richard M. Stallman <rms@gnu.org>
parents: 52401
diff changeset
941 (t
956483cc3659 (calculator-radix-grouping-mode)
Richard M. Stallman <rms@gnu.org>
parents: 52401
diff changeset
942 (setq calculator-displayers
956483cc3659 (calculator-radix-grouping-mode)
Richard M. Stallman <rms@gnu.org>
parents: 52401
diff changeset
943 (if (and new-disp (memq new-disp calculator-displayers))
956483cc3659 (calculator-radix-grouping-mode)
Richard M. Stallman <rms@gnu.org>
parents: 52401
diff changeset
944 (let ((tmp nil))
956483cc3659 (calculator-radix-grouping-mode)
Richard M. Stallman <rms@gnu.org>
parents: 52401
diff changeset
945 (while (not (eq (car calculator-displayers) new-disp))
956483cc3659 (calculator-radix-grouping-mode)
Richard M. Stallman <rms@gnu.org>
parents: 52401
diff changeset
946 (setq tmp (cons (car calculator-displayers) tmp))
956483cc3659 (calculator-radix-grouping-mode)
Richard M. Stallman <rms@gnu.org>
parents: 52401
diff changeset
947 (setq calculator-displayers
956483cc3659 (calculator-radix-grouping-mode)
Richard M. Stallman <rms@gnu.org>
parents: 52401
diff changeset
948 (cdr calculator-displayers)))
956483cc3659 (calculator-radix-grouping-mode)
Richard M. Stallman <rms@gnu.org>
parents: 52401
diff changeset
949 (setq calculator-displayers
956483cc3659 (calculator-radix-grouping-mode)
Richard M. Stallman <rms@gnu.org>
parents: 52401
diff changeset
950 (nconc calculator-displayers (nreverse tmp))))
956483cc3659 (calculator-radix-grouping-mode)
Richard M. Stallman <rms@gnu.org>
parents: 52401
diff changeset
951 (nconc (cdr calculator-displayers)
956483cc3659 (calculator-radix-grouping-mode)
Richard M. Stallman <rms@gnu.org>
parents: 52401
diff changeset
952 (list (car calculator-displayers)))))
956483cc3659 (calculator-radix-grouping-mode)
Richard M. Stallman <rms@gnu.org>
parents: 52401
diff changeset
953 (calculator-message
956483cc3659 (calculator-radix-grouping-mode)
Richard M. Stallman <rms@gnu.org>
parents: 52401
diff changeset
954 "Using %s." (cadr (car calculator-displayers)))))
33491
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
955 (calculator-enter))
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
956
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
957 (defun calculator-rotate-displayer-back ()
59056
956483cc3659 (calculator-radix-grouping-mode)
Richard M. Stallman <rms@gnu.org>
parents: 52401
diff changeset
958 "Like `calculator-rotate-displayer', but rotates modes back.
956483cc3659 (calculator-radix-grouping-mode)
Richard M. Stallman <rms@gnu.org>
parents: 52401
diff changeset
959 If radix output mode is active, toggle digit grouping."
33491
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
960 (interactive)
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
961 (calculator-rotate-displayer (car (last calculator-displayers))))
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
962
39430
48633cf4ce7c (calculator-copy-displayer): New user-option.
Gerd Moellmann <gerd@gnu.org>
parents: 38436
diff changeset
963 (defun calculator-displayer-prev ()
33491
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
964 "Send the current displayer function a 'left argument.
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
965 This is used to modify display arguments (if the current displayer
59056
956483cc3659 (calculator-radix-grouping-mode)
Richard M. Stallman <rms@gnu.org>
parents: 52401
diff changeset
966 function supports this).
956483cc3659 (calculator-radix-grouping-mode)
Richard M. Stallman <rms@gnu.org>
parents: 52401
diff changeset
967 If radix output mode is active, increase the grouping size."
33491
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
968 (interactive)
59056
956483cc3659 (calculator-radix-grouping-mode)
Richard M. Stallman <rms@gnu.org>
parents: 52401
diff changeset
969 (if calculator-output-radix
956483cc3659 (calculator-radix-grouping-mode)
Richard M. Stallman <rms@gnu.org>
parents: 52401
diff changeset
970 (progn (setq calculator-radix-grouping-digits
956483cc3659 (calculator-radix-grouping-mode)
Richard M. Stallman <rms@gnu.org>
parents: 52401
diff changeset
971 (1+ calculator-radix-grouping-digits))
956483cc3659 (calculator-radix-grouping-mode)
Richard M. Stallman <rms@gnu.org>
parents: 52401
diff changeset
972 (calculator-enter))
956483cc3659 (calculator-radix-grouping-mode)
Richard M. Stallman <rms@gnu.org>
parents: 52401
diff changeset
973 (and (car calculator-displayers)
956483cc3659 (calculator-radix-grouping-mode)
Richard M. Stallman <rms@gnu.org>
parents: 52401
diff changeset
974 (let ((disp (caar calculator-displayers)))
956483cc3659 (calculator-radix-grouping-mode)
Richard M. Stallman <rms@gnu.org>
parents: 52401
diff changeset
975 (cond
956483cc3659 (calculator-radix-grouping-mode)
Richard M. Stallman <rms@gnu.org>
parents: 52401
diff changeset
976 ((symbolp disp) (funcall disp 'left))
956483cc3659 (calculator-radix-grouping-mode)
Richard M. Stallman <rms@gnu.org>
parents: 52401
diff changeset
977 ((and (consp disp) (eq 'std (car disp)))
956483cc3659 (calculator-radix-grouping-mode)
Richard M. Stallman <rms@gnu.org>
parents: 52401
diff changeset
978 (calculator-standard-displayer 'left (cadr disp))))))))
33491
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
979
39430
48633cf4ce7c (calculator-copy-displayer): New user-option.
Gerd Moellmann <gerd@gnu.org>
parents: 38436
diff changeset
980 (defun calculator-displayer-next ()
33491
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
981 "Send the current displayer function a 'right argument.
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
982 This is used to modify display arguments (if the current displayer
59056
956483cc3659 (calculator-radix-grouping-mode)
Richard M. Stallman <rms@gnu.org>
parents: 52401
diff changeset
983 function supports this).
956483cc3659 (calculator-radix-grouping-mode)
Richard M. Stallman <rms@gnu.org>
parents: 52401
diff changeset
984 If radix output mode is active, decrease the grouping size."
33491
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
985 (interactive)
59056
956483cc3659 (calculator-radix-grouping-mode)
Richard M. Stallman <rms@gnu.org>
parents: 52401
diff changeset
986 (if calculator-output-radix
956483cc3659 (calculator-radix-grouping-mode)
Richard M. Stallman <rms@gnu.org>
parents: 52401
diff changeset
987 (progn (setq calculator-radix-grouping-digits
956483cc3659 (calculator-radix-grouping-mode)
Richard M. Stallman <rms@gnu.org>
parents: 52401
diff changeset
988 (max 2 (1- calculator-radix-grouping-digits)))
956483cc3659 (calculator-radix-grouping-mode)
Richard M. Stallman <rms@gnu.org>
parents: 52401
diff changeset
989 (calculator-enter))
956483cc3659 (calculator-radix-grouping-mode)
Richard M. Stallman <rms@gnu.org>
parents: 52401
diff changeset
990 (and (car calculator-displayers)
956483cc3659 (calculator-radix-grouping-mode)
Richard M. Stallman <rms@gnu.org>
parents: 52401
diff changeset
991 (let ((disp (caar calculator-displayers)))
956483cc3659 (calculator-radix-grouping-mode)
Richard M. Stallman <rms@gnu.org>
parents: 52401
diff changeset
992 (cond
956483cc3659 (calculator-radix-grouping-mode)
Richard M. Stallman <rms@gnu.org>
parents: 52401
diff changeset
993 ((symbolp disp) (funcall disp 'right))
956483cc3659 (calculator-radix-grouping-mode)
Richard M. Stallman <rms@gnu.org>
parents: 52401
diff changeset
994 ((and (consp disp) (eq 'std (car disp)))
956483cc3659 (calculator-radix-grouping-mode)
Richard M. Stallman <rms@gnu.org>
parents: 52401
diff changeset
995 (calculator-standard-displayer 'right (cadr disp))))))))
33491
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
996
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
997 (defun calculator-remove-zeros (numstr)
99899
2796739a5e4f * calculator.el (calculator-op-or-exp): Reflow docstring.
Juanma Barranquero <lekktu@gmail.com>
parents: 94680
diff changeset
998 "Get a number string NUMSTR and remove unnecessary zeros.
2796739a5e4f * calculator.el (calculator-op-or-exp): Reflow docstring.
Juanma Barranquero <lekktu@gmail.com>
parents: 94680
diff changeset
999 The behavior of this function is controlled by
33491
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
1000 `calculator-remove-zeros'."
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
1001 (cond ((and (eq calculator-remove-zeros t)
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
1002 (string-match "\\.0+\\([eE][+-]?[0-9]*\\)?$" numstr))
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
1003 ;; remove all redundant zeros leaving an integer
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
1004 (if (match-beginning 1)
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
1005 (concat (substring numstr 0 (match-beginning 0))
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
1006 (match-string 1 numstr))
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
1007 (substring numstr 0 (match-beginning 0))))
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
1008 ((and calculator-remove-zeros
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
1009 (string-match
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
1010 "\\..\\([0-9]*[1-9]\\)?\\(0+\\)\\([eE][+-]?[0-9]*\\)?$"
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
1011 numstr))
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
1012 ;; remove zeros, except for first after the "."
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
1013 (if (match-beginning 3)
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
1014 (concat (substring numstr 0 (match-beginning 2))
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
1015 (match-string 3 numstr))
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
1016 (substring numstr 0 (match-beginning 2))))
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
1017 (t numstr)))
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
1018
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
1019 (defun calculator-standard-displayer (num char)
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
1020 "Standard display function, used to display NUM.
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
1021 Its behavior is determined by `calculator-number-digits' and the given
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
1022 CHAR argument (both will be used to compose a format string). If the
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
1023 char is \"n\" then this function will choose one between %f or %e, this
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
1024 is a work around %g jumping to exponential notation too fast.
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
1025
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
1026 The special 'left and 'right symbols will make it change the current
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
1027 number of digits displayed (`calculator-number-digits').
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
1028
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
1029 It will also remove redundant zeros from the result."
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
1030 (if (symbolp num)
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
1031 (cond ((eq num 'left)
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
1032 (and (> calculator-number-digits 0)
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
1033 (setq calculator-number-digits
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
1034 (1- calculator-number-digits))
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
1035 (calculator-enter)))
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
1036 ((eq num 'right)
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
1037 (setq calculator-number-digits
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
1038 (1+ calculator-number-digits))
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
1039 (calculator-enter)))
39430
48633cf4ce7c (calculator-copy-displayer): New user-option.
Gerd Moellmann <gerd@gnu.org>
parents: 38436
diff changeset
1040 (let ((str (if (zerop num)
48633cf4ce7c (calculator-copy-displayer): New user-option.
Gerd Moellmann <gerd@gnu.org>
parents: 38436
diff changeset
1041 "0"
48633cf4ce7c (calculator-copy-displayer): New user-option.
Gerd Moellmann <gerd@gnu.org>
parents: 38436
diff changeset
1042 (format
48633cf4ce7c (calculator-copy-displayer): New user-option.
Gerd Moellmann <gerd@gnu.org>
parents: 38436
diff changeset
1043 (concat "%."
48633cf4ce7c (calculator-copy-displayer): New user-option.
Gerd Moellmann <gerd@gnu.org>
parents: 38436
diff changeset
1044 (number-to-string calculator-number-digits)
48633cf4ce7c (calculator-copy-displayer): New user-option.
Gerd Moellmann <gerd@gnu.org>
parents: 38436
diff changeset
1045 (if (eq char ?n)
48633cf4ce7c (calculator-copy-displayer): New user-option.
Gerd Moellmann <gerd@gnu.org>
parents: 38436
diff changeset
1046 (let ((n (abs num)))
48633cf4ce7c (calculator-copy-displayer): New user-option.
Gerd Moellmann <gerd@gnu.org>
parents: 38436
diff changeset
1047 (if (or (< n 0.001) (> n 1e8)) "e" "f"))
48633cf4ce7c (calculator-copy-displayer): New user-option.
Gerd Moellmann <gerd@gnu.org>
parents: 38436
diff changeset
1048 (string char)))
48633cf4ce7c (calculator-copy-displayer): New user-option.
Gerd Moellmann <gerd@gnu.org>
parents: 38436
diff changeset
1049 num))))
33491
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
1050 (calculator-remove-zeros str))))
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
1051
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
1052 (defun calculator-eng-display (num)
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
1053 "Display NUM in engineering notation.
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
1054 The number of decimal digits used is controlled by
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
1055 `calculator-number-digits', so to change it at runtime you have to use
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
1056 the 'left or 'right when one of the standard modes is used."
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
1057 (if (symbolp num)
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
1058 (cond ((eq num 'left)
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
1059 (setq calculator-eng-extra
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
1060 (if calculator-eng-extra
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
1061 (1+ calculator-eng-extra)
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
1062 1))
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
1063 (let ((calculator-eng-tmp-show t)) (calculator-enter)))
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
1064 ((eq num 'right)
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
1065 (setq calculator-eng-extra
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
1066 (if calculator-eng-extra
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
1067 (1- calculator-eng-extra)
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
1068 -1))
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
1069 (let ((calculator-eng-tmp-show t)) (calculator-enter))))
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
1070 (let ((exp 0))
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
1071 (and (not (= 0 num))
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
1072 (progn
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
1073 (while (< (abs num) 1.0)
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
1074 (setq num (* num 1000.0)) (setq exp (- exp 3)))
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
1075 (while (> (abs num) 999.0)
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
1076 (setq num (/ num 1000.0)) (setq exp (+ exp 3)))
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
1077 (and calculator-eng-tmp-show
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
1078 (not (= 0 calculator-eng-extra))
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
1079 (let ((i calculator-eng-extra))
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
1080 (while (> i 0)
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
1081 (setq num (* num 1000.0)) (setq exp (- exp 3))
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
1082 (setq i (1- i)))
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
1083 (while (< i 0)
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
1084 (setq num (/ num 1000.0)) (setq exp (+ exp 3))
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
1085 (setq i (1+ i)))))))
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
1086 (or calculator-eng-tmp-show (setq calculator-eng-extra nil))
39818
6564021e098e (calculator-eng-display): Don't call concat
Gerd Moellmann <gerd@gnu.org>
parents: 39430
diff changeset
1087 (let ((str (format (concat "%." (number-to-string
6564021e098e (calculator-eng-display): Don't call concat
Gerd Moellmann <gerd@gnu.org>
parents: 39430
diff changeset
1088 calculator-number-digits)
6564021e098e (calculator-eng-display): Don't call concat
Gerd Moellmann <gerd@gnu.org>
parents: 39430
diff changeset
1089 "f")
33491
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
1090 num)))
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
1091 (concat (let ((calculator-remove-zeros
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
1092 ;; make sure we don't leave integers
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
1093 (and calculator-remove-zeros 'x)))
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
1094 (calculator-remove-zeros str))
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
1095 "e" (number-to-string exp))))))
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
1096
59056
956483cc3659 (calculator-radix-grouping-mode)
Richard M. Stallman <rms@gnu.org>
parents: 52401
diff changeset
1097 (defun calculator-number-to-string (num)
27587
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1098 "Convert NUM to a displayable string."
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1099 (cond
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1100 ((and (numberp num) calculator-output-radix)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1101 ;; print with radix - for binary I convert the octal number
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1102 (let ((str (format (if (eq calculator-output-radix 'hex) "%x" "%o")
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1103 (calculator-truncate
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1104 (if calculator-2s-complement num (abs num))))))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1105 (if (eq calculator-output-radix 'bin)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1106 (let ((i -1) (s ""))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1107 (while (< (setq i (1+ i)) (length str))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1108 (setq s
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1109 (concat s
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1110 (cdr (assq (aref str i)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1111 '((?0 . "000") (?1 . "001")
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1112 (?2 . "010") (?3 . "011")
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1113 (?4 . "100") (?5 . "101")
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1114 (?6 . "110") (?7 . "111")))))))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1115 (string-match "^0*\\(.+\\)" s)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1116 (setq str (match-string 1 s))))
59056
956483cc3659 (calculator-radix-grouping-mode)
Richard M. Stallman <rms@gnu.org>
parents: 52401
diff changeset
1117 (if calculator-radix-grouping-mode
956483cc3659 (calculator-radix-grouping-mode)
Richard M. Stallman <rms@gnu.org>
parents: 52401
diff changeset
1118 (let ((d (/ (length str) calculator-radix-grouping-digits))
956483cc3659 (calculator-radix-grouping-mode)
Richard M. Stallman <rms@gnu.org>
parents: 52401
diff changeset
1119 (r (% (length str) calculator-radix-grouping-digits)))
956483cc3659 (calculator-radix-grouping-mode)
Richard M. Stallman <rms@gnu.org>
parents: 52401
diff changeset
1120 (while (>= (setq d (1- d)) (if (zerop r) 1 0))
956483cc3659 (calculator-radix-grouping-mode)
Richard M. Stallman <rms@gnu.org>
parents: 52401
diff changeset
1121 (let ((i (+ r (* d calculator-radix-grouping-digits))))
956483cc3659 (calculator-radix-grouping-mode)
Richard M. Stallman <rms@gnu.org>
parents: 52401
diff changeset
1122 (setq str (concat (substring str 0 i)
956483cc3659 (calculator-radix-grouping-mode)
Richard M. Stallman <rms@gnu.org>
parents: 52401
diff changeset
1123 calculator-radix-grouping-separator
956483cc3659 (calculator-radix-grouping-mode)
Richard M. Stallman <rms@gnu.org>
parents: 52401
diff changeset
1124 (substring str i)))))))
27587
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1125 (upcase
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1126 (if (and (not calculator-2s-complement) (< num 0))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1127 (concat "-" str)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1128 str))))
39430
48633cf4ce7c (calculator-copy-displayer): New user-option.
Gerd Moellmann <gerd@gnu.org>
parents: 38436
diff changeset
1129 ((and (numberp num) calculator-displayer)
48633cf4ce7c (calculator-copy-displayer): New user-option.
Gerd Moellmann <gerd@gnu.org>
parents: 38436
diff changeset
1130 (cond
48633cf4ce7c (calculator-copy-displayer): New user-option.
Gerd Moellmann <gerd@gnu.org>
parents: 38436
diff changeset
1131 ((stringp calculator-displayer)
48633cf4ce7c (calculator-copy-displayer): New user-option.
Gerd Moellmann <gerd@gnu.org>
parents: 38436
diff changeset
1132 (format calculator-displayer num))
48633cf4ce7c (calculator-copy-displayer): New user-option.
Gerd Moellmann <gerd@gnu.org>
parents: 38436
diff changeset
1133 ((symbolp calculator-displayer)
48633cf4ce7c (calculator-copy-displayer): New user-option.
Gerd Moellmann <gerd@gnu.org>
parents: 38436
diff changeset
1134 (funcall calculator-displayer num))
48633cf4ce7c (calculator-copy-displayer): New user-option.
Gerd Moellmann <gerd@gnu.org>
parents: 38436
diff changeset
1135 ((and (consp calculator-displayer)
48633cf4ce7c (calculator-copy-displayer): New user-option.
Gerd Moellmann <gerd@gnu.org>
parents: 38436
diff changeset
1136 (eq 'std (car calculator-displayer)))
48633cf4ce7c (calculator-copy-displayer): New user-option.
Gerd Moellmann <gerd@gnu.org>
parents: 38436
diff changeset
1137 (calculator-standard-displayer num (cadr calculator-displayer)))
48633cf4ce7c (calculator-copy-displayer): New user-option.
Gerd Moellmann <gerd@gnu.org>
parents: 38436
diff changeset
1138 ((listp calculator-displayer)
48633cf4ce7c (calculator-copy-displayer): New user-option.
Gerd Moellmann <gerd@gnu.org>
parents: 38436
diff changeset
1139 (eval calculator-displayer))
48633cf4ce7c (calculator-copy-displayer): New user-option.
Gerd Moellmann <gerd@gnu.org>
parents: 38436
diff changeset
1140 (t (prin1-to-string num t))))
33491
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
1141 ;; operators are printed here
27587
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1142 (t (prin1-to-string (nth 1 num) t))))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1143
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1144 (defun calculator-update-display (&optional force)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1145 "Update the display.
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1146 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
1147 (set-buffer calculator-buffer)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1148 ;; update calculator-stack-display
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1149 (if (or force
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1150 (not (eq (car calculator-stack-display) calculator-stack)))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1151 (setq calculator-stack-display
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1152 (cons calculator-stack
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1153 (if calculator-stack
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1154 (concat
39430
48633cf4ce7c (calculator-copy-displayer): New user-option.
Gerd Moellmann <gerd@gnu.org>
parents: 38436
diff changeset
1155 (let ((calculator-displayer
48633cf4ce7c (calculator-copy-displayer): New user-option.
Gerd Moellmann <gerd@gnu.org>
parents: 38436
diff changeset
1156 (if (and calculator-displayers
48633cf4ce7c (calculator-copy-displayer): New user-option.
Gerd Moellmann <gerd@gnu.org>
parents: 38436
diff changeset
1157 (= 1 (length calculator-stack)))
48633cf4ce7c (calculator-copy-displayer): New user-option.
Gerd Moellmann <gerd@gnu.org>
parents: 38436
diff changeset
1158 ;; customizable display for a single value
48633cf4ce7c (calculator-copy-displayer): New user-option.
Gerd Moellmann <gerd@gnu.org>
parents: 38436
diff changeset
1159 (caar calculator-displayers)
48633cf4ce7c (calculator-copy-displayer): New user-option.
Gerd Moellmann <gerd@gnu.org>
parents: 38436
diff changeset
1160 calculator-displayer)))
59056
956483cc3659 (calculator-radix-grouping-mode)
Richard M. Stallman <rms@gnu.org>
parents: 52401
diff changeset
1161 (mapconcat 'calculator-number-to-string
39430
48633cf4ce7c (calculator-copy-displayer): New user-option.
Gerd Moellmann <gerd@gnu.org>
parents: 38436
diff changeset
1162 (reverse calculator-stack)
48633cf4ce7c (calculator-copy-displayer): New user-option.
Gerd Moellmann <gerd@gnu.org>
parents: 38436
diff changeset
1163 " "))
27587
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1164 " "
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1165 (and calculator-display-fragile
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1166 calculator-saved-list
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1167 (= (car calculator-stack)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1168 (nth calculator-saved-ptr
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1169 calculator-saved-list))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1170 (if (= 0 calculator-saved-ptr)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1171 (format "[%s]" (length calculator-saved-list))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1172 (format "[%s/%s]"
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1173 (- (length calculator-saved-list)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1174 calculator-saved-ptr)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1175 (length calculator-saved-list)))))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1176 ""))))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1177 (let ((inhibit-read-only t))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1178 (erase-buffer)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1179 (insert (calculator-get-prompt)))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1180 (set-buffer-modified-p nil)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1181 (if calculator-display-fragile
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1182 (goto-char (1+ (length calculator-prompt)))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1183 (goto-char (1- (point)))))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1184
33631
86ab384be9d7 New version from author.
Gerd Moellmann <gerd@gnu.org>
parents: 33551
diff changeset
1185 ;;;---------------------------------------------------------------------
33491
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
1186 ;;; Stack computations
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
1187
27587
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1188 (defun calculator-reduce-stack (prec)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1189 "Reduce the stack using top operator.
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1190 PREC is a precedence - reduce everything with higher precedence."
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1191 (while
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1192 (cond
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1193 ((and (cdr (cdr calculator-stack)) ; have three values
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1194 (consp (nth 0 calculator-stack)) ; two operators & num
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1195 (numberp (nth 1 calculator-stack))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1196 (consp (nth 2 calculator-stack))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1197 (eq '\) (nth 1 (nth 0 calculator-stack)))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1198 (eq '\( (nth 1 (nth 2 calculator-stack))))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1199 ;; reduce "... ( x )" --> "... x"
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1200 (setq calculator-stack
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1201 (cons (nth 1 calculator-stack)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1202 (nthcdr 3 calculator-stack)))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1203 ;; another iteration
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1204 t)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1205 ((and (cdr (cdr calculator-stack)) ; have three values
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1206 (numberp (nth 0 calculator-stack)) ; two nums & operator
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1207 (consp (nth 1 calculator-stack))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1208 (numberp (nth 2 calculator-stack))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1209 (= 2 (calculator-op-arity ; binary operator
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1210 (nth 1 calculator-stack)))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1211 (<= prec ; with higher prec.
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1212 (calculator-op-prec (nth 1 calculator-stack))))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1213 ;; reduce "... x op y" --> "... r", r is the result
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1214 (setq calculator-stack
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1215 (cons (calculator-funcall
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1216 (nth 2 (nth 1 calculator-stack))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1217 (nth 2 calculator-stack)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1218 (nth 0 calculator-stack))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1219 (nthcdr 3 calculator-stack)))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1220 ;; another iteration
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1221 t)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1222 ((and (>= (length calculator-stack) 2) ; have two values
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1223 (numberp (nth 0 calculator-stack)) ; number & operator
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1224 (consp (nth 1 calculator-stack))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1225 (= -1 (calculator-op-arity ; prefix-unary op
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1226 (nth 1 calculator-stack)))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1227 (<= prec ; with higher prec.
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1228 (calculator-op-prec (nth 1 calculator-stack))))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1229 ;; reduce "... op x" --> "... r" for prefix op
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1230 (setq calculator-stack
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1231 (cons (calculator-funcall
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1232 (nth 2 (nth 1 calculator-stack))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1233 (nth 0 calculator-stack))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1234 (nthcdr 2 calculator-stack)))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1235 ;; another iteration
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1236 t)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1237 ((and (cdr calculator-stack) ; have two values
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1238 (consp (nth 0 calculator-stack)) ; operator & number
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1239 (numberp (nth 1 calculator-stack))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1240 (= +1 (calculator-op-arity ; postfix-unary op
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1241 (nth 0 calculator-stack)))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1242 (<= prec ; with higher prec.
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1243 (calculator-op-prec (nth 0 calculator-stack))))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1244 ;; reduce "... x op" --> "... r" for postfix op
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1245 (setq calculator-stack
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1246 (cons (calculator-funcall
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1247 (nth 2 (nth 0 calculator-stack))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1248 (nth 1 calculator-stack))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1249 (nthcdr 2 calculator-stack)))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1250 ;; another iteration
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1251 t)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1252 ((and calculator-stack ; have one value
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1253 (consp (nth 0 calculator-stack)) ; an operator
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1254 (= 0 (calculator-op-arity ; 0-ary op
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1255 (nth 0 calculator-stack))))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1256 ;; reduce "... op" --> "... r" for 0-ary op
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1257 (setq calculator-stack
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1258 (cons (calculator-funcall
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1259 (nth 2 (nth 0 calculator-stack)))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1260 (nthcdr 1 calculator-stack)))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1261 ;; another iteration
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1262 t)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1263 ((and (cdr calculator-stack) ; have two values
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1264 (numberp (nth 0 calculator-stack)) ; both numbers
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1265 (numberp (nth 1 calculator-stack)))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1266 ;; get rid of redundant numbers:
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1267 ;; reduce "... y x" --> "... x"
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1268 ;; needed for 0-ary ops that puts more values
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1269 (setcdr calculator-stack (cdr (cdr calculator-stack))))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1270 (t ;; no more iterations
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1271 nil))))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1272
33491
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
1273 (defun calculator-funcall (f &optional X Y)
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
1274 "If F is a symbol, evaluate (F X Y).
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
1275 Otherwise, it should be a list, evaluate it with X, Y bound to the
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
1276 arguments."
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
1277 ;; remember binary ops for calculator-repR/L
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
1278 (if Y (setq calculator-last-opXY (list f X Y)))
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
1279 (condition-case nil
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
1280 ;; there used to be code here that returns 0 if the result was
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
1281 ;; smaller than calculator-epsilon (1e-15). I don't think this is
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
1282 ;; necessary now.
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
1283 (if (symbolp f)
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
1284 (cond ((and X Y) (funcall f X Y))
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
1285 (X (funcall f X))
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
1286 (t (funcall f)))
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
1287 ;; f is an expression
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
1288 (let* ((__f__ f) ; so we can get this value below...
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
1289 (TX (calculator-truncate X))
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
1290 (TY (and Y (calculator-truncate Y)))
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
1291 (DX (if calculator-deg (/ (* X pi) 180) X))
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
1292 (L calculator-saved-list)
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
1293 (Fbound (fboundp 'F))
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
1294 (Fsave (and Fbound (symbol-function 'F)))
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
1295 (Dbound (fboundp 'D))
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
1296 (Dsave (and Dbound (symbol-function 'D))))
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
1297 ;; a shortened version of flet
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
1298 (fset 'F (function
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
1299 (lambda (&optional x y)
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
1300 (calculator-funcall __f__ x y))))
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
1301 (fset 'D (function
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
1302 (lambda (x)
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
1303 (if calculator-deg (/ (* x 180) pi) x))))
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
1304 (unwind-protect (eval f)
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
1305 (if Fbound (fset 'F Fsave) (fmakunbound 'F))
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
1306 (if Dbound (fset 'D Dsave) (fmakunbound 'D)))))
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
1307 (error 0)))
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
1308
33631
86ab384be9d7 New version from author.
Gerd Moellmann <gerd@gnu.org>
parents: 33551
diff changeset
1309 ;;;---------------------------------------------------------------------
33491
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
1310 ;;; Input interaction
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
1311
27904
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
1312 (defun calculator-last-input (&optional keys)
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
1313 "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
1314 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
1315 (let ((inp (or keys (this-command-keys))))
27587
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1316 (if (or (stringp inp) (not (arrayp inp)))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1317 inp
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1318 ;; 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
1319 ;; lookup operators
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1320 (let* ((i -1) (converted-str (make-string (length inp) ? )) k)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1321 ;; converts an array to a string the ops lookup with keypad
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1322 ;; input
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1323 (while (< (setq i (1+ i)) (length inp))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1324 (setq k (aref inp i))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1325 ;; if Emacs will someday have a event-key, then this would
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1326 ;; probably be modified anyway
64381
c25db06be8ca (calculator-last-input): Guard uses of event-key and key-press-event-p.
Richard M. Stallman <rms@gnu.org>
parents: 64091
diff changeset
1327 (and (if (fboundp 'key-press-event-p) (key-press-event-p k))
c25db06be8ca (calculator-last-input): Guard uses of event-key and key-press-event-p.
Richard M. Stallman <rms@gnu.org>
parents: 64091
diff changeset
1328 (if (fboundp 'event-key)
c25db06be8ca (calculator-last-input): Guard uses of event-key and key-press-event-p.
Richard M. Stallman <rms@gnu.org>
parents: 64091
diff changeset
1329 (and (event-key k) (setq k (event-key k)))))
27587
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1330 ;; assume all symbols are translatable with an ascii-character
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1331 (and (symbolp k)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1332 (setq k (or (get k 'ascii-character) ? )))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1333 (aset converted-str i k))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1334 converted-str))))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1335
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1336 (defun calculator-clear-fragile (&optional op)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1337 "Clear the fragile flag if it was set, then maybe reset all.
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1338 OP is the operator (if any) that caused this call."
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1339 (if (and calculator-display-fragile
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1340 (or (not op)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1341 (= -1 (calculator-op-arity op))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1342 (= 0 (calculator-op-arity op))))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1343 ;; reset if last calc finished, and now get a num or prefix or 0-ary
33491
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
1344 ;; op
27587
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1345 (calculator-reset))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1346 (setq calculator-display-fragile nil))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1347
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1348 (defun calculator-digit ()
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1349 "Enter a single digit."
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1350 (interactive)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1351 (let ((inp (aref (calculator-last-input) 0)))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1352 (if (and (or calculator-display-fragile
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1353 (not (numberp (car calculator-stack))))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1354 (cond
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1355 ((not calculator-input-radix) (<= inp ?9))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1356 ((eq calculator-input-radix 'bin) (<= inp ?1))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1357 ((eq calculator-input-radix 'oct) (<= inp ?7))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1358 (t t)))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1359 ;; enter digit if starting a new computation or have an op on the
33491
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
1360 ;; stack
27587
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1361 (progn
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1362 (calculator-clear-fragile)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1363 (let ((digit (upcase (char-to-string inp))))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1364 (if (equal calculator-curnum "0")
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1365 (setq calculator-curnum nil))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1366 (setq calculator-curnum
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1367 (concat (or calculator-curnum "") digit)))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1368 (calculator-update-display)))))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1369
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1370 (defun calculator-decimal ()
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1371 "Enter a decimal period."
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1372 (interactive)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1373 (if (and (not calculator-input-radix)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1374 (or calculator-display-fragile
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1375 (not (numberp (car calculator-stack))))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1376 (not (and calculator-curnum
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1377 (string-match "[.eE]" calculator-curnum))))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1378 ;; enter the period on the same condition as a digit, only if no
33491
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
1379 ;; period or exponent entered yet
27587
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1380 (progn
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1381 (calculator-clear-fragile)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1382 (setq calculator-curnum (concat (or calculator-curnum "0") "."))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1383 (calculator-update-display))))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1384
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1385 (defun calculator-exp ()
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1386 "Enter an `E' exponent character, or a digit in hex input mode."
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1387 (interactive)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1388 (if calculator-input-radix
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1389 (calculator-digit)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1390 (if (and (or calculator-display-fragile
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1391 (not (numberp (car calculator-stack))))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1392 (not (and calculator-curnum
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1393 (string-match "[eE]" calculator-curnum))))
33491
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
1394 ;; same condition as above, also no E so far
27587
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1395 (progn
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1396 (calculator-clear-fragile)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1397 (setq calculator-curnum (concat (or calculator-curnum "1") "e"))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1398 (calculator-update-display)))))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1399
27904
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
1400 (defun calculator-op (&optional keys)
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
1401 "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
1402 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
1403 (interactive)
33491
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
1404 (catch 'op-error
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
1405 (let* ((last-inp (calculator-last-input keys))
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
1406 (op (assoc last-inp calculator-operators)))
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
1407 (calculator-clear-fragile op)
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
1408 (if (and calculator-curnum (/= (calculator-op-arity op) 0))
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
1409 (setq calculator-stack
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
1410 (cons (calculator-curnum-value) calculator-stack)))
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
1411 (setq calculator-curnum nil)
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
1412 (if (and (= 2 (calculator-op-arity op))
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
1413 (not (and calculator-stack
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
1414 (numberp (nth 0 calculator-stack)))))
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
1415 ;; we have a binary operator but no number - search for a prefix
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
1416 ;; version
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
1417 (let ((rest-ops calculator-operators))
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
1418 (while (not (equal last-inp (car (car rest-ops))))
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
1419 (setq rest-ops (cdr rest-ops)))
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
1420 (setq op (assoc last-inp (cdr rest-ops)))
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
1421 (if (not (and op (= -1 (calculator-op-arity op))))
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
1422 ;;(error "Binary operator without a first operand")
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
1423 (progn
59056
956483cc3659 (calculator-radix-grouping-mode)
Richard M. Stallman <rms@gnu.org>
parents: 52401
diff changeset
1424 (calculator-message
956483cc3659 (calculator-radix-grouping-mode)
Richard M. Stallman <rms@gnu.org>
parents: 52401
diff changeset
1425 "Binary operator without a first operand")
33491
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
1426 (throw 'op-error nil)))))
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
1427 (calculator-reduce-stack
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
1428 (cond ((eq (nth 1 op) '\() 10)
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
1429 ((eq (nth 1 op) '\)) 0)
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
1430 (t (calculator-op-prec op))))
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
1431 (if (or (and (= -1 (calculator-op-arity op))
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
1432 (numberp (car calculator-stack)))
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
1433 (and (/= (calculator-op-arity op) -1)
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
1434 (/= (calculator-op-arity op) 0)
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
1435 (not (numberp (car calculator-stack)))))
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
1436 ;;(error "Unterminated expression")
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
1437 (progn
59056
956483cc3659 (calculator-radix-grouping-mode)
Richard M. Stallman <rms@gnu.org>
parents: 52401
diff changeset
1438 (calculator-message "Unterminated expression")
33491
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
1439 (throw 'op-error nil)))
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
1440 (setq calculator-stack (cons op calculator-stack))
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
1441 (calculator-reduce-stack (calculator-op-prec op))
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
1442 (and (= (length calculator-stack) 1)
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
1443 (numberp (nth 0 calculator-stack))
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
1444 ;; the display is fragile if it contains only one number
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
1445 (setq calculator-display-fragile t)
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
1446 ;; add number to the saved-list
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
1447 calculator-add-saved
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
1448 (if (= 0 calculator-saved-ptr)
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
1449 (setq calculator-saved-list
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
1450 (cons (car calculator-stack) calculator-saved-list))
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
1451 (let ((p (nthcdr (1- calculator-saved-ptr)
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
1452 calculator-saved-list)))
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
1453 (setcdr p (cons (car calculator-stack) (cdr p))))))
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
1454 (calculator-update-display))))
27587
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1455
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1456 (defun calculator-op-or-exp ()
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1457 "Either enter an operator or a digit.
33491
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
1458 Used with +/- for entering them as digits in numbers like 1e-3 (there is
99899
2796739a5e4f * calculator.el (calculator-op-or-exp): Reflow docstring.
Juanma Barranquero <lekktu@gmail.com>
parents: 94680
diff changeset
1459 no need for negative numbers since these are handled by unary operators)."
27587
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1460 (interactive)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1461 (if (and (not calculator-display-fragile)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1462 calculator-curnum
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1463 (string-match "[eE]$" calculator-curnum))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1464 (calculator-digit)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1465 (calculator-op)))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1466
33631
86ab384be9d7 New version from author.
Gerd Moellmann <gerd@gnu.org>
parents: 33551
diff changeset
1467 ;;;---------------------------------------------------------------------
33491
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
1468 ;;; Input/output modes (not display)
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
1469
27587
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1470 (defun calculator-dec/deg-mode ()
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1471 "Set decimal mode for display & input, if decimal, toggle deg mode."
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1472 (interactive)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1473 (if calculator-curnum
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1474 (setq calculator-stack
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1475 (cons (calculator-curnum-value) calculator-stack)))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1476 (setq calculator-curnum nil)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1477 (if (or calculator-input-radix calculator-output-radix)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1478 (progn (setq calculator-input-radix nil)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1479 (setq calculator-output-radix nil))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1480 ;; already decimal - toggle degrees mode
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1481 (setq calculator-deg (not calculator-deg)))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1482 (calculator-update-display t))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1483
27904
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
1484 (defun calculator-radix-mode (&optional keys)
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
1485 "Set input and display radix modes.
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
1486 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
1487 (interactive)
27904
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
1488 (calculator-radix-input-mode keys)
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
1489 (calculator-radix-output-mode keys))
27587
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1490
27904
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
1491 (defun calculator-radix-input-mode (&optional keys)
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
1492 "Set input radix modes.
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
1493 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
1494 (interactive)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1495 (if calculator-curnum
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1496 (setq calculator-stack
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1497 (cons (calculator-curnum-value) calculator-stack)))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1498 (setq calculator-curnum nil)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1499 (setq calculator-input-radix
27904
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
1500 (let ((inp (calculator-last-input keys)))
27587
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1501 (cdr (assq (upcase (aref inp (1- (length inp))))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1502 calculator-char-radix))))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1503 (calculator-update-display))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1504
27904
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
1505 (defun calculator-radix-output-mode (&optional keys)
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
1506 "Set display radix modes.
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
1507 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
1508 (interactive)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1509 (if calculator-curnum
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1510 (setq calculator-stack
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1511 (cons (calculator-curnum-value) calculator-stack)))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1512 (setq calculator-curnum nil)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1513 (setq calculator-output-radix
27904
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
1514 (let ((inp (calculator-last-input keys)))
27587
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1515 (cdr (assq (upcase (aref inp (1- (length inp))))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1516 calculator-char-radix))))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1517 (calculator-update-display t))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1518
33631
86ab384be9d7 New version from author.
Gerd Moellmann <gerd@gnu.org>
parents: 33551
diff changeset
1519 ;;;---------------------------------------------------------------------
33491
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
1520 ;;; Saved values list
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
1521
27587
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1522 (defun calculator-save-on-list ()
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1523 "Evaluate current expression, put result on the saved values list."
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1524 (interactive)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1525 (let ((calculator-add-saved t)) ; marks the result to be added
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1526 (calculator-enter)))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1527
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1528 (defun calculator-clear-saved ()
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1529 "Clear the list of saved values in `calculator-saved-list'."
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1530 (interactive)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1531 (setq calculator-saved-list nil)
33491
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
1532 (setq calculator-saved-ptr 0)
27587
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1533 (calculator-update-display t))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1534
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1535 (defun calculator-saved-move (n)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1536 "Go N elements up the list of saved values."
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1537 (interactive)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1538 (and calculator-saved-list
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1539 (or (null calculator-stack) calculator-display-fragile)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1540 (progn
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1541 (setq calculator-saved-ptr
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1542 (max (min (+ n calculator-saved-ptr)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1543 (length calculator-saved-list))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1544 0))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1545 (if (nth calculator-saved-ptr calculator-saved-list)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1546 (setq calculator-stack
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1547 (list (nth calculator-saved-ptr calculator-saved-list))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1548 calculator-display-fragile t)
27904
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
1549 (calculator-reset))
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
1550 (calculator-update-display))))
27587
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1551
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1552 (defun calculator-saved-up ()
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1553 "Go up the list of saved values."
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1554 (interactive)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1555 (calculator-saved-move +1))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1556
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1557 (defun calculator-saved-down ()
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1558 "Go down the list of saved values."
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1559 (interactive)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1560 (calculator-saved-move -1))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1561
33631
86ab384be9d7 New version from author.
Gerd Moellmann <gerd@gnu.org>
parents: 33551
diff changeset
1562 ;;;---------------------------------------------------------------------
33491
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
1563 ;;; Misc functions
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
1564
27587
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1565 (defun calculator-open-paren ()
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1566 "Equivalents of `(' use this."
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1567 (interactive)
27904
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
1568 (calculator-op "("))
27587
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1569
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1570 (defun calculator-close-paren ()
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1571 "Equivalents of `)' use this."
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1572 (interactive)
27904
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
1573 (calculator-op ")"))
27587
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1574
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1575 (defun calculator-enter ()
27904
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
1576 "Evaluate current expression."
27587
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1577 (interactive)
27904
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
1578 (calculator-op "="))
27587
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1579
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1580 (defun calculator-backspace ()
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1581 "Backward delete a single digit or a stack element."
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1582 (interactive)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1583 (if calculator-curnum
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1584 (setq calculator-curnum
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1585 (if (> (length calculator-curnum) 1)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1586 (substring calculator-curnum
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1587 0 (1- (length calculator-curnum)))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1588 nil))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1589 (setq calculator-stack (cdr calculator-stack)))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1590 (calculator-update-display))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1591
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1592 (defun calculator-clear ()
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1593 "Clear current number."
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1594 (interactive)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1595 (setq calculator-curnum nil)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1596 (cond
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1597 ;; if the current number is from the saved-list - remove it
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1598 ((and calculator-display-fragile
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1599 calculator-saved-list
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1600 (= (car calculator-stack)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1601 (nth calculator-saved-ptr calculator-saved-list)))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1602 (if (= 0 calculator-saved-ptr)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1603 (setq calculator-saved-list (cdr calculator-saved-list))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1604 (let ((p (nthcdr (1- calculator-saved-ptr)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1605 calculator-saved-list)))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1606 (setcdr p (cdr (cdr p)))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1607 (setq calculator-saved-ptr (1- calculator-saved-ptr))))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1608 (if calculator-saved-list
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1609 (setq calculator-stack
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1610 (list (nth calculator-saved-ptr calculator-saved-list)))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1611 (calculator-reset)))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1612 ;; reset if fragile or double clear
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1613 ((or calculator-display-fragile (eq last-command this-command))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1614 (calculator-reset)))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1615 (calculator-update-display))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1616
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1617 (defun calculator-copy ()
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1618 "Copy current number to the `kill-ring'."
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1619 (interactive)
39430
48633cf4ce7c (calculator-copy-displayer): New user-option.
Gerd Moellmann <gerd@gnu.org>
parents: 38436
diff changeset
1620 (let ((calculator-displayer
48633cf4ce7c (calculator-copy-displayer): New user-option.
Gerd Moellmann <gerd@gnu.org>
parents: 38436
diff changeset
1621 (or calculator-copy-displayer calculator-displayer))
48633cf4ce7c (calculator-copy-displayer): New user-option.
Gerd Moellmann <gerd@gnu.org>
parents: 38436
diff changeset
1622 (calculator-displayers
48633cf4ce7c (calculator-copy-displayer): New user-option.
Gerd Moellmann <gerd@gnu.org>
parents: 38436
diff changeset
1623 (if calculator-copy-displayer nil calculator-displayers)))
48633cf4ce7c (calculator-copy-displayer): New user-option.
Gerd Moellmann <gerd@gnu.org>
parents: 38436
diff changeset
1624 (calculator-enter)
64440
41bfd05eff2a (calculator-copy): Delete duplicate words.
Juri Linkov <juri@jurta.org>
parents: 64381
diff changeset
1625 ;; remove trailing spaces and an index
39430
48633cf4ce7c (calculator-copy-displayer): New user-option.
Gerd Moellmann <gerd@gnu.org>
parents: 38436
diff changeset
1626 (let ((s (cdr calculator-stack-display)))
48633cf4ce7c (calculator-copy-displayer): New user-option.
Gerd Moellmann <gerd@gnu.org>
parents: 38436
diff changeset
1627 (and s
48633cf4ce7c (calculator-copy-displayer): New user-option.
Gerd Moellmann <gerd@gnu.org>
parents: 38436
diff changeset
1628 (if (string-match "^\\([^ ]+\\) *\\(\\[[0-9/]+\\]\\)? *$" s)
48633cf4ce7c (calculator-copy-displayer): New user-option.
Gerd Moellmann <gerd@gnu.org>
parents: 38436
diff changeset
1629 (setq s (match-string 1 s)))
48633cf4ce7c (calculator-copy-displayer): New user-option.
Gerd Moellmann <gerd@gnu.org>
parents: 38436
diff changeset
1630 (kill-new s)))))
27587
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1631
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1632 (defun calculator-set-register (reg)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1633 "Set a register value for REG."
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1634 (interactive "cRegister to store into: ")
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1635 (let* ((as (assq reg calculator-registers))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1636 (val (progn (calculator-enter) (car calculator-stack))))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1637 (if as
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1638 (setcdr as val)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1639 (setq calculator-registers
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1640 (cons (cons reg val) calculator-registers)))
59056
956483cc3659 (calculator-radix-grouping-mode)
Richard M. Stallman <rms@gnu.org>
parents: 52401
diff changeset
1641 (calculator-message "[%c] := %S" reg val)))
27587
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1642
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1643 (defun calculator-put-value (val)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1644 "Paste VAL as if entered.
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1645 Used by `calculator-paste' and `get-register'."
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1646 (if (and (numberp val)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1647 ;; (not calculator-curnum)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1648 (or calculator-display-fragile
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1649 (not (numberp (car calculator-stack)))))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1650 (progn
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1651 (calculator-clear-fragile)
39430
48633cf4ce7c (calculator-copy-displayer): New user-option.
Gerd Moellmann <gerd@gnu.org>
parents: 38436
diff changeset
1652 (setq calculator-curnum (let ((calculator-displayer "%S"))
59056
956483cc3659 (calculator-radix-grouping-mode)
Richard M. Stallman <rms@gnu.org>
parents: 52401
diff changeset
1653 (calculator-number-to-string val)))
27587
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1654 (calculator-update-display))))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1655
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1656 (defun calculator-paste ()
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1657 "Paste a value from the `kill-ring'."
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1658 (interactive)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1659 (calculator-put-value
59056
956483cc3659 (calculator-radix-grouping-mode)
Richard M. Stallman <rms@gnu.org>
parents: 52401
diff changeset
1660 (let ((str (replace-regexp-in-string
956483cc3659 (calculator-radix-grouping-mode)
Richard M. Stallman <rms@gnu.org>
parents: 52401
diff changeset
1661 "^ *\\(.+[^ ]\\) *$" "\\1" (current-kill 0))))
956483cc3659 (calculator-radix-grouping-mode)
Richard M. Stallman <rms@gnu.org>
parents: 52401
diff changeset
1662 (and (not calculator-input-radix)
956483cc3659 (calculator-radix-grouping-mode)
Richard M. Stallman <rms@gnu.org>
parents: 52401
diff changeset
1663 calculator-paste-decimals
33631
86ab384be9d7 New version from author.
Gerd Moellmann <gerd@gnu.org>
parents: 33551
diff changeset
1664 (string-match "\\([0-9]+\\)\\(\\.[0-9]+\\)?\\(e[0-9]+\\)?"
86ab384be9d7 New version from author.
Gerd Moellmann <gerd@gnu.org>
parents: 33551
diff changeset
1665 str)
86ab384be9d7 New version from author.
Gerd Moellmann <gerd@gnu.org>
parents: 33551
diff changeset
1666 (or (match-string 1 str)
86ab384be9d7 New version from author.
Gerd Moellmann <gerd@gnu.org>
parents: 33551
diff changeset
1667 (match-string 2 str)
86ab384be9d7 New version from author.
Gerd Moellmann <gerd@gnu.org>
parents: 33551
diff changeset
1668 (match-string 3 str))
59056
956483cc3659 (calculator-radix-grouping-mode)
Richard M. Stallman <rms@gnu.org>
parents: 52401
diff changeset
1669 (setq str (concat (or (match-string 1 str) "0")
33631
86ab384be9d7 New version from author.
Gerd Moellmann <gerd@gnu.org>
parents: 33551
diff changeset
1670 (or (match-string 2 str) ".0")
59056
956483cc3659 (calculator-radix-grouping-mode)
Richard M. Stallman <rms@gnu.org>
parents: 52401
diff changeset
1671 (or (match-string 3 str) ""))))
956483cc3659 (calculator-radix-grouping-mode)
Richard M. Stallman <rms@gnu.org>
parents: 52401
diff changeset
1672 (condition-case nil (calculator-string-to-number str)
33491
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
1673 (error nil)))))
27587
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1674
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1675 (defun calculator-get-register (reg)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1676 "Get a value from a register REG."
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1677 (interactive "cRegister to get value from: ")
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1678 (calculator-put-value (cdr (assq reg calculator-registers))))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1679
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1680 (defun calculator-help ()
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1681 ;; this is used as the quick reference screen you get with `h'
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1682 "Quick reference:
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1683 * numbers/operators/parens/./e - enter expressions
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1684 + - * / \\(div) %(rem) _(-X,postfix) ;(1/X,postfix) ^(exp) L(og)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1685 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
1686 * >/< repeats last binary operation with its 2nd (1st) arg as postfix op
33491
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
1687 * I inverses next trig function * '/\"/{} - display/display args
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
1688 * D - switch to all-decimal, or toggle deg/rad mode
27587
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1689 * 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
1690 * 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
1691 * enter/= - evaluate current expr. * s/g - set/get a register
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1692 * space - evaluate & save on list * l/v - list total/average
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1693 * 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
1694 * C-insert - copy whole expr. * C-return - evaluate, copy, exit
27587
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1695 * insert - paste a number * backspace- delete backwards
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1696 * delete - clear argument or list value or whole expression (twice)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1697 * escape/q - exit."
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1698 (interactive)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1699 (if (eq last-command 'calculator-help)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1700 (let ((mode-name "Calculator")
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1701 (major-mode 'calculator-mode)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1702 (g-map (current-global-map))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1703 (win (selected-window)))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1704 (require 'ehelp)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1705 (if calculator-electric-mode
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1706 (use-global-map calculator-saved-global-map))
33631
86ab384be9d7 New version from author.
Gerd Moellmann <gerd@gnu.org>
parents: 33551
diff changeset
1707 (if (or (not calculator-electric-mode)
86ab384be9d7 New version from author.
Gerd Moellmann <gerd@gnu.org>
parents: 33551
diff changeset
1708 ;; XEmacs has a problem with electric-describe-mode
85511
f873840f9fea * emulation/edt-mapper.el (function-key-map):
Dan Nicolaescu <dann@ics.uci.edu>
parents: 83794
diff changeset
1709 (featurep 'xemacs))
33631
86ab384be9d7 New version from author.
Gerd Moellmann <gerd@gnu.org>
parents: 33551
diff changeset
1710 (describe-mode)
86ab384be9d7 New version from author.
Gerd Moellmann <gerd@gnu.org>
parents: 33551
diff changeset
1711 (electric-describe-mode))
27587
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1712 (if calculator-electric-mode
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1713 (use-global-map g-map))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1714 (select-window win) ; these are for XEmacs (also below)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1715 (message nil))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1716 (let ((one (one-window-p t))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1717 (win (selected-window))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1718 (help-buf (get-buffer-create "*Help*")))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1719 (save-window-excursion
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1720 (with-output-to-temp-buffer "*Help*"
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1721 (princ (documentation 'calculator-help)))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1722 (if one
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1723 (shrink-window-if-larger-than-buffer
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1724 (get-buffer-window help-buf)))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1725 (message
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1726 "`%s' again for more help, any other key continues normally."
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1727 (calculator-last-input))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1728 (select-window win)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1729 (sit-for 360))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1730 (select-window win))))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1731
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1732 (defun calculator-quit ()
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1733 "Quit calculator."
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1734 (interactive)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1735 (set-buffer calculator-buffer)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1736 (let ((inhibit-read-only t)) (erase-buffer))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1737 (if (not calculator-electric-mode)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1738 (progn
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1739 (condition-case nil
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1740 (while (get-buffer-window calculator-buffer)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1741 (delete-window (get-buffer-window calculator-buffer)))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1742 (error nil))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1743 (kill-buffer calculator-buffer)))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1744 (setq calculator-buffer nil)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1745 (message "Calculator done.")
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1746 (if calculator-electric-mode (throw 'calculator-done nil)))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1747
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1748 (defun calculator-save-and-quit ()
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1749 "Quit the calculator, saving the result on the `kill-ring'."
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1750 (interactive)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1751 (calculator-enter)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1752 (calculator-copy)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1753 (calculator-quit))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1754
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1755 (defun calculator-repR (x)
99899
2796739a5e4f * calculator.el (calculator-op-or-exp): Reflow docstring.
Juanma Barranquero <lekktu@gmail.com>
parents: 94680
diff changeset
1756 "Repeat the last binary operation with its second argument and X.
27587
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1757 To use this, apply a binary operator (evaluate it), then call this."
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1758 (if calculator-last-opXY
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1759 ;; avoid rebinding calculator-last-opXY
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1760 (let ((calculator-last-opXY calculator-last-opXY))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1761 (calculator-funcall
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1762 (car calculator-last-opXY) x (nth 2 calculator-last-opXY)))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1763 x))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1764
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1765 (defun calculator-repL (x)
99899
2796739a5e4f * calculator.el (calculator-op-or-exp): Reflow docstring.
Juanma Barranquero <lekktu@gmail.com>
parents: 94680
diff changeset
1766 "Repeat the last binary operation with its first argument and X.
27587
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1767 To use this, apply a binary operator (evaluate it), then call this."
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1768 (if calculator-last-opXY
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1769 ;; avoid rebinding calculator-last-opXY
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1770 (let ((calculator-last-opXY calculator-last-opXY))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1771 (calculator-funcall
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1772 (car calculator-last-opXY) (nth 1 calculator-last-opXY) x))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1773 x))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1774
81696
c29faa83ba3a (calculator-expt, calculator-integer-p): New functions.
Jay Belanger <jay.p.belanger@gmail.com>
parents: 75773
diff changeset
1775 (defun calculator-integer-p (x)
c29faa83ba3a (calculator-expt, calculator-integer-p): New functions.
Jay Belanger <jay.p.belanger@gmail.com>
parents: 75773
diff changeset
1776 "Non-nil if X is equal to an integer."
c29faa83ba3a (calculator-expt, calculator-integer-p): New functions.
Jay Belanger <jay.p.belanger@gmail.com>
parents: 75773
diff changeset
1777 (condition-case nil
c29faa83ba3a (calculator-expt, calculator-integer-p): New functions.
Jay Belanger <jay.p.belanger@gmail.com>
parents: 75773
diff changeset
1778 (= x (ftruncate x))
c29faa83ba3a (calculator-expt, calculator-integer-p): New functions.
Jay Belanger <jay.p.belanger@gmail.com>
parents: 75773
diff changeset
1779 (error nil)))
c29faa83ba3a (calculator-expt, calculator-integer-p): New functions.
Jay Belanger <jay.p.belanger@gmail.com>
parents: 75773
diff changeset
1780
c29faa83ba3a (calculator-expt, calculator-integer-p): New functions.
Jay Belanger <jay.p.belanger@gmail.com>
parents: 75773
diff changeset
1781 (defun calculator-expt (x y)
c29faa83ba3a (calculator-expt, calculator-integer-p): New functions.
Jay Belanger <jay.p.belanger@gmail.com>
parents: 75773
diff changeset
1782 "Compute X^Y, dealing with errors appropriately."
c29faa83ba3a (calculator-expt, calculator-integer-p): New functions.
Jay Belanger <jay.p.belanger@gmail.com>
parents: 75773
diff changeset
1783 (condition-case
c29faa83ba3a (calculator-expt, calculator-integer-p): New functions.
Jay Belanger <jay.p.belanger@gmail.com>
parents: 75773
diff changeset
1784 nil
c29faa83ba3a (calculator-expt, calculator-integer-p): New functions.
Jay Belanger <jay.p.belanger@gmail.com>
parents: 75773
diff changeset
1785 (expt x y)
c29faa83ba3a (calculator-expt, calculator-integer-p): New functions.
Jay Belanger <jay.p.belanger@gmail.com>
parents: 75773
diff changeset
1786 (domain-error 0.0e+NaN)
c29faa83ba3a (calculator-expt, calculator-integer-p): New functions.
Jay Belanger <jay.p.belanger@gmail.com>
parents: 75773
diff changeset
1787 (range-error
81700
a92fa56df453 (calculator-expt): Use more cases to determine the value.
Jay Belanger <jay.p.belanger@gmail.com>
parents: 81696
diff changeset
1788 (cond
a92fa56df453 (calculator-expt): Use more cases to determine the value.
Jay Belanger <jay.p.belanger@gmail.com>
parents: 81696
diff changeset
1789 ((and (< x 1.0) (> x -1.0))
a92fa56df453 (calculator-expt): Use more cases to determine the value.
Jay Belanger <jay.p.belanger@gmail.com>
parents: 81696
diff changeset
1790 ;; For small x, the range error comes from large y.
a92fa56df453 (calculator-expt): Use more cases to determine the value.
Jay Belanger <jay.p.belanger@gmail.com>
parents: 81696
diff changeset
1791 0.0)
a92fa56df453 (calculator-expt): Use more cases to determine the value.
Jay Belanger <jay.p.belanger@gmail.com>
parents: 81696
diff changeset
1792 ((and (> x 0.0) (< y 0.0))
94389
c8cc1acc029f (calculator-expt): Modify previous change to just use the expanded cl
Glenn Morris <rgm@gnu.org>
parents: 94388
diff changeset
1793 ;; For large positive x and negative y, the range error
81700
a92fa56df453 (calculator-expt): Use more cases to determine the value.
Jay Belanger <jay.p.belanger@gmail.com>
parents: 81696
diff changeset
1794 ;; comes from large negative y.
a92fa56df453 (calculator-expt): Use more cases to determine the value.
Jay Belanger <jay.p.belanger@gmail.com>
parents: 81696
diff changeset
1795 0.0)
a92fa56df453 (calculator-expt): Use more cases to determine the value.
Jay Belanger <jay.p.belanger@gmail.com>
parents: 81696
diff changeset
1796 ((and (> x 0.0) (> y 0.0))
94389
c8cc1acc029f (calculator-expt): Modify previous change to just use the expanded cl
Glenn Morris <rgm@gnu.org>
parents: 94388
diff changeset
1797 ;; For large positive x and positive y, the range error
81700
a92fa56df453 (calculator-expt): Use more cases to determine the value.
Jay Belanger <jay.p.belanger@gmail.com>
parents: 81696
diff changeset
1798 ;; comes from large y.
a92fa56df453 (calculator-expt): Use more cases to determine the value.
Jay Belanger <jay.p.belanger@gmail.com>
parents: 81696
diff changeset
1799 1.0e+INF)
a92fa56df453 (calculator-expt): Use more cases to determine the value.
Jay Belanger <jay.p.belanger@gmail.com>
parents: 81696
diff changeset
1800 ;; For the rest, x must be large and negative.
a92fa56df453 (calculator-expt): Use more cases to determine the value.
Jay Belanger <jay.p.belanger@gmail.com>
parents: 81696
diff changeset
1801 ;; The range errors come from large integer y.
a92fa56df453 (calculator-expt): Use more cases to determine the value.
Jay Belanger <jay.p.belanger@gmail.com>
parents: 81696
diff changeset
1802 ((< y 0.0)
a92fa56df453 (calculator-expt): Use more cases to determine the value.
Jay Belanger <jay.p.belanger@gmail.com>
parents: 81696
diff changeset
1803 0.0)
94389
c8cc1acc029f (calculator-expt): Modify previous change to just use the expanded cl
Glenn Morris <rgm@gnu.org>
parents: 94388
diff changeset
1804 ((eq (logand (truncate y) 1) 1) ; expansion of cl `oddp'
81700
a92fa56df453 (calculator-expt): Use more cases to determine the value.
Jay Belanger <jay.p.belanger@gmail.com>
parents: 81696
diff changeset
1805 ;; If y is odd
a92fa56df453 (calculator-expt): Use more cases to determine the value.
Jay Belanger <jay.p.belanger@gmail.com>
parents: 81696
diff changeset
1806 -1.0e+INF)
a92fa56df453 (calculator-expt): Use more cases to determine the value.
Jay Belanger <jay.p.belanger@gmail.com>
parents: 81696
diff changeset
1807 (t
99899
2796739a5e4f * calculator.el (calculator-op-or-exp): Reflow docstring.
Juanma Barranquero <lekktu@gmail.com>
parents: 94680
diff changeset
1808 ;;
81700
a92fa56df453 (calculator-expt): Use more cases to determine the value.
Jay Belanger <jay.p.belanger@gmail.com>
parents: 81696
diff changeset
1809 1.0e+INF)))
81696
c29faa83ba3a (calculator-expt, calculator-integer-p): New functions.
Jay Belanger <jay.p.belanger@gmail.com>
parents: 75773
diff changeset
1810 (error 0.0e+NaN)))
c29faa83ba3a (calculator-expt, calculator-integer-p): New functions.
Jay Belanger <jay.p.belanger@gmail.com>
parents: 75773
diff changeset
1811
27587
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1812 (defun calculator-fact (x)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1813 "Simple factorial of X."
81696
c29faa83ba3a (calculator-expt, calculator-integer-p): New functions.
Jay Belanger <jay.p.belanger@gmail.com>
parents: 75773
diff changeset
1814 (if (and (>= x 0)
c29faa83ba3a (calculator-expt, calculator-integer-p): New functions.
Jay Belanger <jay.p.belanger@gmail.com>
parents: 75773
diff changeset
1815 (calculator-integer-p x))
c29faa83ba3a (calculator-expt, calculator-integer-p): New functions.
Jay Belanger <jay.p.belanger@gmail.com>
parents: 75773
diff changeset
1816 (if (= (calculator-expt (/ x 3.0) x) 1.0e+INF)
c29faa83ba3a (calculator-expt, calculator-integer-p): New functions.
Jay Belanger <jay.p.belanger@gmail.com>
parents: 75773
diff changeset
1817 1.0e+INF
c29faa83ba3a (calculator-expt, calculator-integer-p): New functions.
Jay Belanger <jay.p.belanger@gmail.com>
parents: 75773
diff changeset
1818 (let ((r (if (<= x 10) 1 1.0)))
c29faa83ba3a (calculator-expt, calculator-integer-p): New functions.
Jay Belanger <jay.p.belanger@gmail.com>
parents: 75773
diff changeset
1819 (while (> x 0)
c29faa83ba3a (calculator-expt, calculator-integer-p): New functions.
Jay Belanger <jay.p.belanger@gmail.com>
parents: 75773
diff changeset
1820 (setq r (* r (truncate x)))
c29faa83ba3a (calculator-expt, calculator-integer-p): New functions.
Jay Belanger <jay.p.belanger@gmail.com>
parents: 75773
diff changeset
1821 (setq x (1- x)))
c29faa83ba3a (calculator-expt, calculator-integer-p): New functions.
Jay Belanger <jay.p.belanger@gmail.com>
parents: 75773
diff changeset
1822 (+ 0.0 r)))
c29faa83ba3a (calculator-expt, calculator-integer-p): New functions.
Jay Belanger <jay.p.belanger@gmail.com>
parents: 75773
diff changeset
1823 (if (= x 1.0e+INF)
c29faa83ba3a (calculator-expt, calculator-integer-p): New functions.
Jay Belanger <jay.p.belanger@gmail.com>
parents: 75773
diff changeset
1824 x
c29faa83ba3a (calculator-expt, calculator-integer-p): New functions.
Jay Belanger <jay.p.belanger@gmail.com>
parents: 75773
diff changeset
1825 0.0e+NaN)))
27587
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1826
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1827 (defun calculator-truncate (n)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1828 "Truncate N, return 0 in case of overflow."
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1829 (condition-case nil (truncate n) (error 0)))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1830
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1831
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1832 (provide 'calculator)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1833
93975
1e3a407766b9 Fix up comment convention on the arch-tag lines.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 87649
diff changeset
1834 ;; arch-tag: a1b9766c-af8a-4a74-b466-65ad8eeb0c73
27587
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1835 ;;; calculator.el ends here