annotate lisp/calculator.el @ 56811:694cd033cd0d

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