annotate lisp/calculator.el @ 46205:6676ac71682b

Update mouse button info. Don't give the names of Emacs commands that the characters run. Clarify what SPC and DEL do. Clarify the description of the minibuffer. Wording change for completion. Explain Mouse-2 better.
author Richard M. Stallman <rms@gnu.org>
date Sun, 07 Jul 2002 11:31:31 +0000
parents f18f05d77411
children 336c18b62203
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)))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
671 (if calculator-electric-mode
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
672 (save-window-excursion
27904
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
673 (progn (require 'electric) (message nil)) ; hide load message
27587
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
674 (let (old-g-map old-l-map (echo-keystrokes 0)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
675 (garbage-collection-messages nil)) ; no gc msg when electric
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
676 ;; strange behavior in FSF: doesn't always select correct
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
677 ;; minibuffer. I have no idea how to fix this
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
678 (setq calculator-buffer (window-buffer (minibuffer-window)))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
679 (select-window (minibuffer-window))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
680 (calculator-reset)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
681 (calculator-update-display)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
682 (setq old-l-map (current-local-map))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
683 (setq old-g-map (current-global-map))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
684 (setq calculator-saved-global-map (current-global-map))
27904
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
685 (use-local-map nil)
27587
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
686 (use-global-map calculator-mode-map)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
687 (unwind-protect
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
688 (catch 'calculator-done
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
689 (Electric-command-loop
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
690 'calculator-done
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
691 ;; can't use 'noprompt, bug in electric.el
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
692 '(lambda () 'noprompt)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
693 nil
27904
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
694 (lambda (x y) (calculator-update-display))))
27587
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
695 (and calculator-buffer
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
696 (catch 'calculator-done (calculator-quit)))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
697 (use-local-map old-l-map)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
698 (use-global-map old-g-map))))
27904
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
699 (progn
39430
48633cf4ce7c (calculator-copy-displayer): New user-option.
Gerd Moellmann <gerd@gnu.org>
parents: 38436
diff changeset
700 (setq calculator-buffer (get-buffer-create "*calculator*"))
48633cf4ce7c (calculator-copy-displayer): New user-option.
Gerd Moellmann <gerd@gnu.org>
parents: 38436
diff changeset
701 (cond
48633cf4ce7c (calculator-copy-displayer): New user-option.
Gerd Moellmann <gerd@gnu.org>
parents: 38436
diff changeset
702 ((not (get-buffer-window calculator-buffer))
48633cf4ce7c (calculator-copy-displayer): New user-option.
Gerd Moellmann <gerd@gnu.org>
parents: 38436
diff changeset
703 (let ((split-window-keep-point nil)
48633cf4ce7c (calculator-copy-displayer): New user-option.
Gerd Moellmann <gerd@gnu.org>
parents: 38436
diff changeset
704 (window-min-height 2))
48633cf4ce7c (calculator-copy-displayer): New user-option.
Gerd Moellmann <gerd@gnu.org>
parents: 38436
diff changeset
705 ;; 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
706 ;; `raised' modeline in Emacs 21
48633cf4ce7c (calculator-copy-displayer): New user-option.
Gerd Moellmann <gerd@gnu.org>
parents: 38436
diff changeset
707 (select-window
48633cf4ce7c (calculator-copy-displayer): New user-option.
Gerd Moellmann <gerd@gnu.org>
parents: 38436
diff changeset
708 (split-window-vertically
48633cf4ce7c (calculator-copy-displayer): New user-option.
Gerd Moellmann <gerd@gnu.org>
parents: 38436
diff changeset
709 (if (and (fboundp 'face-attr-construct)
48633cf4ce7c (calculator-copy-displayer): New user-option.
Gerd Moellmann <gerd@gnu.org>
parents: 38436
diff changeset
710 (plist-get (face-attr-construct 'modeline) :box))
48633cf4ce7c (calculator-copy-displayer): New user-option.
Gerd Moellmann <gerd@gnu.org>
parents: 38436
diff changeset
711 -3 -2)))
48633cf4ce7c (calculator-copy-displayer): New user-option.
Gerd Moellmann <gerd@gnu.org>
parents: 38436
diff changeset
712 (switch-to-buffer calculator-buffer)))
48633cf4ce7c (calculator-copy-displayer): New user-option.
Gerd Moellmann <gerd@gnu.org>
parents: 38436
diff changeset
713 ((not (eq (current-buffer) calculator-buffer))
48633cf4ce7c (calculator-copy-displayer): New user-option.
Gerd Moellmann <gerd@gnu.org>
parents: 38436
diff changeset
714 (select-window (get-buffer-window calculator-buffer))))
27904
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
715 (calculator-mode)
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
716 (setq buffer-read-only t)
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
717 (calculator-reset)
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
718 (message "Hit `?' For a quick help screen.")))
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
719 (if (and calculator-restart-other-mode calculator-electric-mode)
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
720 (calculator)))
27587
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
721
33631
86ab384be9d7 New version from author.
Gerd Moellmann <gerd@gnu.org>
parents: 33551
diff changeset
722 ;;;---------------------------------------------------------------------
43091
f18f05d77411 (calculator-displayers): Doc fixes.
Pavel Janík <Pavel@Janik.cz>
parents: 39818
diff changeset
723 ;;; Operators
33491
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
724
27587
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
725 (defun calculator-op-arity (op)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
726 "Return OP's arity, 2, +1 or -1."
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
727 (let ((arity (or (nth 3 op) 'x)))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
728 (if (numberp arity)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
729 arity
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
730 (if (eq calculator-unary-style 'postfix) +1 -1))))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
731
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
732 (defun calculator-op-prec (op)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
733 "Return OP's precedence for reducing when inserting into the stack.
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
734 Defaults to 1."
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
735 (or (nth 4 op) 1))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
736
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
737 (defun calculator-add-operators (more-ops)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
738 "This function handles operator addition.
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
739 Adds MORE-OPS to `calculator-operator', called initially to handle
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
740 `calculator-initial-operators' and `calculator-user-operators'."
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
741 (let ((added-ops nil))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
742 (while more-ops
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
743 (or (eq (car (car more-ops)) 'nobind)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
744 (let ((i -1) (key (car (car more-ops))))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
745 ;; make sure the key is undefined, so it's easy to define
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
746 ;; prefix keys
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
747 (while (< (setq i (1+ i)) (length key))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
748 (or (keymapp
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
749 (lookup-key calculator-mode-map
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
750 (substring key 0 (1+ i))))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
751 (progn
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
752 (define-key
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
753 calculator-mode-map (substring key 0 (1+ i)) nil)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
754 (setq i (length key)))))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
755 (define-key calculator-mode-map key 'calculator-op)))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
756 (setq added-ops (cons (if (eq (car (car more-ops)) 'nobind)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
757 (cdr (car more-ops))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
758 (car more-ops))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
759 added-ops))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
760 (setq more-ops (cdr more-ops)))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
761 ;; added-ops come first, but in correct order
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
762 (setq calculator-operators
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
763 (append (nreverse added-ops) calculator-operators))))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
764
33631
86ab384be9d7 New version from author.
Gerd Moellmann <gerd@gnu.org>
parents: 33551
diff changeset
765 ;;;---------------------------------------------------------------------
33491
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
766 ;;; Display stuff
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
767
27587
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
768 (defun calculator-reset ()
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
769 "Reset calculator variables."
27904
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
770 (or calculator-restart-other-mode
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
771 (setq calculator-stack nil
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
772 calculator-curnum nil
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
773 calculator-stack-display nil
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
774 calculator-display-fragile nil))
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
775 (setq calculator-restart-other-mode nil)
27587
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
776 (calculator-update-display))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
777
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
778 (defun calculator-get-prompt ()
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
779 "Return a string to display.
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
780 The string is set not to exceed the screen width."
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
781 (let* ((calculator-prompt
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
782 (format calculator-prompt
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
783 (cond
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
784 ((or calculator-output-radix calculator-input-radix)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
785 (if (eq calculator-output-radix
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
786 calculator-input-radix)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
787 (concat
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
788 (char-to-string
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
789 (car (rassq calculator-output-radix
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
790 calculator-char-radix)))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
791 "=")
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
792 (concat
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
793 (if calculator-input-radix
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
794 (char-to-string
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
795 (car (rassq calculator-input-radix
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
796 calculator-char-radix)))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
797 "=")
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
798 (char-to-string
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
799 (car (rassq calculator-output-radix
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
800 calculator-char-radix))))))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
801 (calculator-deg "D=")
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
802 (t "=="))))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
803 (prompt
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
804 (concat calculator-prompt
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
805 (cdr calculator-stack-display)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
806 (cond (calculator-curnum
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
807 ;; number being typed
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
808 (concat calculator-curnum "_"))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
809 ((and (= 1 (length calculator-stack))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
810 calculator-display-fragile)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
811 ;; only the result is shown, next number will
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
812 ;; restart
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
813 nil)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
814 (t
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
815 ;; waiting for a number or an operator
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
816 "?"))))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
817 (trim (- (length prompt) (1- (window-width)))))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
818 (if (<= trim 0)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
819 prompt
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
820 (concat calculator-prompt
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
821 (substring prompt (+ trim (length calculator-prompt)))))))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
822
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
823 (defun calculator-curnum-value ()
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
824 "Get the numeric value of the displayed number string as a float."
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
825 (if calculator-input-radix
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
826 (let ((radix
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
827 (cdr (assq calculator-input-radix
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
828 '((bin . 2) (oct . 8) (hex . 16)))))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
829 (i -1) (value 0))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
830 ;; assume valid input (upcased & characters in range)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
831 (while (< (setq i (1+ i)) (length calculator-curnum))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
832 (setq value
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
833 (+ (let ((ch (aref calculator-curnum i)))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
834 (- ch (if (<= ch ?9) ?0 (- ?A 10))))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
835 (* radix value))))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
836 value)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
837 (car
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
838 (read-from-string
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
839 (cond
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
840 ((equal "." calculator-curnum)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
841 "0.0")
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
842 ((string-match "[eE][+-]?$" calculator-curnum)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
843 (concat calculator-curnum "0"))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
844 ((string-match "\\.[0-9]\\|[eE]" calculator-curnum)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
845 calculator-curnum)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
846 ((string-match "\\." calculator-curnum)
33491
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
847 ;; do this because Emacs reads "23." as an integer
27587
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 ((stringp calculator-curnum)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
850 (concat calculator-curnum ".0"))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
851 (t "0.0"))))))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
852
33491
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
853 (defun calculator-rotate-displayer (&optional new-disp)
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
854 "Switch to the next displayer on the `calculator-displayers' list.
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
855 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
856 that argument."
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
857 (interactive)
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
858 (setq calculator-displayers
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
859 (if (and new-disp (memq new-disp calculator-displayers))
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
860 (let ((tmp nil))
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
861 (while (not (eq (car calculator-displayers) new-disp))
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
862 (setq tmp (cons (car calculator-displayers) tmp))
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
863 (setq calculator-displayers (cdr calculator-displayers)))
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
864 (setq calculator-displayers
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
865 (nconc calculator-displayers (nreverse tmp))))
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
866 (nconc (cdr calculator-displayers)
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
867 (list (car calculator-displayers)))))
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
868 (message "Using %s." (cadr (car calculator-displayers)))
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
869 (if calculator-electric-mode
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
870 (progn (sit-for 1) (message nil)))
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
871 (calculator-enter))
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
872
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
873 (defun calculator-rotate-displayer-back ()
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
874 "Like `calculator-rotate-displayer', but rotates modes back."
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
875 (interactive)
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
876 (calculator-rotate-displayer (car (last calculator-displayers))))
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
877
39430
48633cf4ce7c (calculator-copy-displayer): New user-option.
Gerd Moellmann <gerd@gnu.org>
parents: 38436
diff changeset
878 (defun calculator-displayer-prev ()
33491
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
879 "Send the current displayer function a 'left argument.
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
880 This is used to modify display arguments (if the current displayer
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
881 function supports this)."
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
882 (interactive)
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
883 (and (car calculator-displayers)
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
884 (let ((disp (caar calculator-displayers)))
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
885 (cond ((symbolp disp) (funcall disp 'left))
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
886 ((and (consp disp) (eq 'std (car disp)))
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
887 (calculator-standard-displayer 'left (cadr disp)))))))
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
888
39430
48633cf4ce7c (calculator-copy-displayer): New user-option.
Gerd Moellmann <gerd@gnu.org>
parents: 38436
diff changeset
889 (defun calculator-displayer-next ()
33491
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
890 "Send the current displayer function a 'right argument.
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
891 This is used to modify display arguments (if the current displayer
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
892 function supports this)."
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
893 (interactive)
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
894 (and (car calculator-displayers)
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
895 (let ((disp (caar calculator-displayers)))
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
896 (cond ((symbolp disp) (funcall disp 'right))
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
897 ((and (consp disp) (eq 'std (car disp)))
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
898 (calculator-standard-displayer 'right (cadr disp)))))))
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
899
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
900 (defun calculator-remove-zeros (numstr)
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
901 "Get a number string NUMSTR and remove unnecessary zeroes.
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
902 the behavior of this function is controlled by
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
903 `calculator-remove-zeros'."
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
904 (cond ((and (eq calculator-remove-zeros t)
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
905 (string-match "\\.0+\\([eE][+-]?[0-9]*\\)?$" numstr))
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
906 ;; remove all redundant zeros leaving an integer
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
907 (if (match-beginning 1)
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
908 (concat (substring numstr 0 (match-beginning 0))
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
909 (match-string 1 numstr))
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
910 (substring numstr 0 (match-beginning 0))))
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
911 ((and calculator-remove-zeros
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
912 (string-match
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
913 "\\..\\([0-9]*[1-9]\\)?\\(0+\\)\\([eE][+-]?[0-9]*\\)?$"
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
914 numstr))
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
915 ;; remove zeros, except for first after the "."
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
916 (if (match-beginning 3)
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
917 (concat (substring numstr 0 (match-beginning 2))
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
918 (match-string 3 numstr))
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
919 (substring numstr 0 (match-beginning 2))))
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
920 (t numstr)))
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
921
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
922 (defun calculator-standard-displayer (num char)
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
923 "Standard display function, used to display NUM.
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
924 Its behavior is determined by `calculator-number-digits' and the given
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
925 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
926 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
927 is a work around %g jumping to exponential notation too fast.
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
928
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
929 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
930 number of digits displayed (`calculator-number-digits').
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
931
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
932 It will also remove redundant zeros from the result."
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
933 (if (symbolp num)
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
934 (cond ((eq num 'left)
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
935 (and (> calculator-number-digits 0)
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
936 (setq calculator-number-digits
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
937 (1- calculator-number-digits))
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
938 (calculator-enter)))
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
939 ((eq num 'right)
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
940 (setq calculator-number-digits
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
941 (1+ calculator-number-digits))
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
942 (calculator-enter)))
39430
48633cf4ce7c (calculator-copy-displayer): New user-option.
Gerd Moellmann <gerd@gnu.org>
parents: 38436
diff changeset
943 (let ((str (if (zerop num)
48633cf4ce7c (calculator-copy-displayer): New user-option.
Gerd Moellmann <gerd@gnu.org>
parents: 38436
diff changeset
944 "0"
48633cf4ce7c (calculator-copy-displayer): New user-option.
Gerd Moellmann <gerd@gnu.org>
parents: 38436
diff changeset
945 (format
48633cf4ce7c (calculator-copy-displayer): New user-option.
Gerd Moellmann <gerd@gnu.org>
parents: 38436
diff changeset
946 (concat "%."
48633cf4ce7c (calculator-copy-displayer): New user-option.
Gerd Moellmann <gerd@gnu.org>
parents: 38436
diff changeset
947 (number-to-string calculator-number-digits)
48633cf4ce7c (calculator-copy-displayer): New user-option.
Gerd Moellmann <gerd@gnu.org>
parents: 38436
diff changeset
948 (if (eq char ?n)
48633cf4ce7c (calculator-copy-displayer): New user-option.
Gerd Moellmann <gerd@gnu.org>
parents: 38436
diff changeset
949 (let ((n (abs num)))
48633cf4ce7c (calculator-copy-displayer): New user-option.
Gerd Moellmann <gerd@gnu.org>
parents: 38436
diff changeset
950 (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
951 (string char)))
48633cf4ce7c (calculator-copy-displayer): New user-option.
Gerd Moellmann <gerd@gnu.org>
parents: 38436
diff changeset
952 num))))
33491
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
953 (calculator-remove-zeros str))))
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
954
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
955 (defun calculator-eng-display (num)
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
956 "Display NUM in engineering notation.
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
957 The number of decimal digits used is controlled by
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
958 `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
959 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
960 (if (symbolp num)
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
961 (cond ((eq num 'left)
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
962 (setq calculator-eng-extra
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
963 (if calculator-eng-extra
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
964 (1+ calculator-eng-extra)
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
965 1))
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
966 (let ((calculator-eng-tmp-show t)) (calculator-enter)))
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
967 ((eq num 'right)
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
968 (setq calculator-eng-extra
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
969 (if calculator-eng-extra
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
970 (1- calculator-eng-extra)
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
971 -1))
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
972 (let ((calculator-eng-tmp-show t)) (calculator-enter))))
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
973 (let ((exp 0))
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
974 (and (not (= 0 num))
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
975 (progn
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
976 (while (< (abs num) 1.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 (while (> (abs num) 999.0)
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
979 (setq num (/ num 1000.0)) (setq exp (+ exp 3)))
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
980 (and calculator-eng-tmp-show
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
981 (not (= 0 calculator-eng-extra))
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
982 (let ((i calculator-eng-extra))
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
983 (while (> i 0)
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
984 (setq num (* num 1000.0)) (setq exp (- exp 3))
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
985 (setq i (1- i)))
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
986 (while (< i 0)
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
987 (setq num (/ num 1000.0)) (setq exp (+ exp 3))
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
988 (setq i (1+ i)))))))
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
989 (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
990 (let ((str (format (concat "%." (number-to-string
6564021e098e (calculator-eng-display): Don't call concat
Gerd Moellmann <gerd@gnu.org>
parents: 39430
diff changeset
991 calculator-number-digits)
6564021e098e (calculator-eng-display): Don't call concat
Gerd Moellmann <gerd@gnu.org>
parents: 39430
diff changeset
992 "f")
33491
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
993 num)))
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
994 (concat (let ((calculator-remove-zeros
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
995 ;; make sure we don't leave integers
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
996 (and calculator-remove-zeros 'x)))
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
997 (calculator-remove-zeros str))
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
998 "e" (number-to-string exp))))))
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
999
27587
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1000 (defun calculator-num-to-string (num)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1001 "Convert NUM to a displayable string."
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1002 (cond
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1003 ((and (numberp num) calculator-output-radix)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1004 ;; print with radix - for binary I convert the octal number
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1005 (let ((str (format (if (eq calculator-output-radix 'hex) "%x" "%o")
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1006 (calculator-truncate
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1007 (if calculator-2s-complement num (abs num))))))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1008 (if (eq calculator-output-radix 'bin)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1009 (let ((i -1) (s ""))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1010 (while (< (setq i (1+ i)) (length str))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1011 (setq s
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1012 (concat s
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1013 (cdr (assq (aref str i)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1014 '((?0 . "000") (?1 . "001")
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1015 (?2 . "010") (?3 . "011")
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1016 (?4 . "100") (?5 . "101")
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1017 (?6 . "110") (?7 . "111")))))))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1018 (string-match "^0*\\(.+\\)" s)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1019 (setq str (match-string 1 s))))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1020 (upcase
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1021 (if (and (not calculator-2s-complement) (< num 0))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1022 (concat "-" str)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1023 str))))
39430
48633cf4ce7c (calculator-copy-displayer): New user-option.
Gerd Moellmann <gerd@gnu.org>
parents: 38436
diff changeset
1024 ((and (numberp num) calculator-displayer)
48633cf4ce7c (calculator-copy-displayer): New user-option.
Gerd Moellmann <gerd@gnu.org>
parents: 38436
diff changeset
1025 (cond
48633cf4ce7c (calculator-copy-displayer): New user-option.
Gerd Moellmann <gerd@gnu.org>
parents: 38436
diff changeset
1026 ((stringp calculator-displayer)
48633cf4ce7c (calculator-copy-displayer): New user-option.
Gerd Moellmann <gerd@gnu.org>
parents: 38436
diff changeset
1027 (format calculator-displayer num))
48633cf4ce7c (calculator-copy-displayer): New user-option.
Gerd Moellmann <gerd@gnu.org>
parents: 38436
diff changeset
1028 ((symbolp calculator-displayer)
48633cf4ce7c (calculator-copy-displayer): New user-option.
Gerd Moellmann <gerd@gnu.org>
parents: 38436
diff changeset
1029 (funcall calculator-displayer num))
48633cf4ce7c (calculator-copy-displayer): New user-option.
Gerd Moellmann <gerd@gnu.org>
parents: 38436
diff changeset
1030 ((and (consp calculator-displayer)
48633cf4ce7c (calculator-copy-displayer): New user-option.
Gerd Moellmann <gerd@gnu.org>
parents: 38436
diff changeset
1031 (eq 'std (car calculator-displayer)))
48633cf4ce7c (calculator-copy-displayer): New user-option.
Gerd Moellmann <gerd@gnu.org>
parents: 38436
diff changeset
1032 (calculator-standard-displayer num (cadr calculator-displayer)))
48633cf4ce7c (calculator-copy-displayer): New user-option.
Gerd Moellmann <gerd@gnu.org>
parents: 38436
diff changeset
1033 ((listp calculator-displayer)
48633cf4ce7c (calculator-copy-displayer): New user-option.
Gerd Moellmann <gerd@gnu.org>
parents: 38436
diff changeset
1034 (eval calculator-displayer))
48633cf4ce7c (calculator-copy-displayer): New user-option.
Gerd Moellmann <gerd@gnu.org>
parents: 38436
diff changeset
1035 (t (prin1-to-string num t))))
33491
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
1036 ;; operators are printed here
27587
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1037 (t (prin1-to-string (nth 1 num) t))))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1038
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1039 (defun calculator-update-display (&optional force)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1040 "Update the display.
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1041 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
1042 (set-buffer calculator-buffer)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1043 ;; update calculator-stack-display
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1044 (if (or force
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1045 (not (eq (car calculator-stack-display) calculator-stack)))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1046 (setq calculator-stack-display
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1047 (cons calculator-stack
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1048 (if calculator-stack
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1049 (concat
39430
48633cf4ce7c (calculator-copy-displayer): New user-option.
Gerd Moellmann <gerd@gnu.org>
parents: 38436
diff changeset
1050 (let ((calculator-displayer
48633cf4ce7c (calculator-copy-displayer): New user-option.
Gerd Moellmann <gerd@gnu.org>
parents: 38436
diff changeset
1051 (if (and calculator-displayers
48633cf4ce7c (calculator-copy-displayer): New user-option.
Gerd Moellmann <gerd@gnu.org>
parents: 38436
diff changeset
1052 (= 1 (length calculator-stack)))
48633cf4ce7c (calculator-copy-displayer): New user-option.
Gerd Moellmann <gerd@gnu.org>
parents: 38436
diff changeset
1053 ;; customizable display for a single value
48633cf4ce7c (calculator-copy-displayer): New user-option.
Gerd Moellmann <gerd@gnu.org>
parents: 38436
diff changeset
1054 (caar calculator-displayers)
48633cf4ce7c (calculator-copy-displayer): New user-option.
Gerd Moellmann <gerd@gnu.org>
parents: 38436
diff changeset
1055 calculator-displayer)))
48633cf4ce7c (calculator-copy-displayer): New user-option.
Gerd Moellmann <gerd@gnu.org>
parents: 38436
diff changeset
1056 (mapconcat 'calculator-num-to-string
48633cf4ce7c (calculator-copy-displayer): New user-option.
Gerd Moellmann <gerd@gnu.org>
parents: 38436
diff changeset
1057 (reverse calculator-stack)
48633cf4ce7c (calculator-copy-displayer): New user-option.
Gerd Moellmann <gerd@gnu.org>
parents: 38436
diff changeset
1058 " "))
27587
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1059 " "
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1060 (and calculator-display-fragile
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1061 calculator-saved-list
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1062 (= (car calculator-stack)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1063 (nth calculator-saved-ptr
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1064 calculator-saved-list))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1065 (if (= 0 calculator-saved-ptr)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1066 (format "[%s]" (length calculator-saved-list))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1067 (format "[%s/%s]"
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 calculator-saved-ptr)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1070 (length calculator-saved-list)))))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1071 ""))))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1072 (let ((inhibit-read-only t))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1073 (erase-buffer)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1074 (insert (calculator-get-prompt)))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1075 (set-buffer-modified-p nil)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1076 (if calculator-display-fragile
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1077 (goto-char (1+ (length calculator-prompt)))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1078 (goto-char (1- (point)))))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1079
33631
86ab384be9d7 New version from author.
Gerd Moellmann <gerd@gnu.org>
parents: 33551
diff changeset
1080 ;;;---------------------------------------------------------------------
33491
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
1081 ;;; Stack computations
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
1082
27587
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1083 (defun calculator-reduce-stack (prec)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1084 "Reduce the stack using top operator.
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1085 PREC is a precedence - reduce everything with higher precedence."
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1086 (while
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1087 (cond
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1088 ((and (cdr (cdr calculator-stack)) ; have three values
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1089 (consp (nth 0 calculator-stack)) ; two operators & num
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1090 (numberp (nth 1 calculator-stack))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1091 (consp (nth 2 calculator-stack))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1092 (eq '\) (nth 1 (nth 0 calculator-stack)))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1093 (eq '\( (nth 1 (nth 2 calculator-stack))))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1094 ;; reduce "... ( x )" --> "... x"
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1095 (setq calculator-stack
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1096 (cons (nth 1 calculator-stack)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1097 (nthcdr 3 calculator-stack)))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1098 ;; another iteration
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1099 t)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1100 ((and (cdr (cdr calculator-stack)) ; have three values
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1101 (numberp (nth 0 calculator-stack)) ; two nums & operator
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1102 (consp (nth 1 calculator-stack))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1103 (numberp (nth 2 calculator-stack))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1104 (= 2 (calculator-op-arity ; binary operator
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1105 (nth 1 calculator-stack)))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1106 (<= prec ; with higher prec.
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1107 (calculator-op-prec (nth 1 calculator-stack))))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1108 ;; reduce "... x op y" --> "... r", r is the result
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1109 (setq calculator-stack
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1110 (cons (calculator-funcall
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1111 (nth 2 (nth 1 calculator-stack))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1112 (nth 2 calculator-stack)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1113 (nth 0 calculator-stack))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1114 (nthcdr 3 calculator-stack)))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1115 ;; another iteration
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1116 t)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1117 ((and (>= (length calculator-stack) 2) ; have two values
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1118 (numberp (nth 0 calculator-stack)) ; number & operator
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1119 (consp (nth 1 calculator-stack))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1120 (= -1 (calculator-op-arity ; prefix-unary op
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1121 (nth 1 calculator-stack)))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1122 (<= prec ; with higher prec.
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1123 (calculator-op-prec (nth 1 calculator-stack))))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1124 ;; reduce "... op x" --> "... r" for prefix op
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1125 (setq calculator-stack
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1126 (cons (calculator-funcall
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1127 (nth 2 (nth 1 calculator-stack))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1128 (nth 0 calculator-stack))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1129 (nthcdr 2 calculator-stack)))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1130 ;; another iteration
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1131 t)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1132 ((and (cdr calculator-stack) ; have two values
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1133 (consp (nth 0 calculator-stack)) ; operator & number
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1134 (numberp (nth 1 calculator-stack))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1135 (= +1 (calculator-op-arity ; postfix-unary op
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1136 (nth 0 calculator-stack)))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1137 (<= prec ; with higher prec.
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1138 (calculator-op-prec (nth 0 calculator-stack))))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1139 ;; reduce "... x op" --> "... r" for postfix op
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1140 (setq calculator-stack
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1141 (cons (calculator-funcall
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1142 (nth 2 (nth 0 calculator-stack))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1143 (nth 1 calculator-stack))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1144 (nthcdr 2 calculator-stack)))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1145 ;; another iteration
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1146 t)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1147 ((and calculator-stack ; have one value
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1148 (consp (nth 0 calculator-stack)) ; an operator
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1149 (= 0 (calculator-op-arity ; 0-ary op
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1150 (nth 0 calculator-stack))))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1151 ;; reduce "... op" --> "... r" for 0-ary op
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1152 (setq calculator-stack
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1153 (cons (calculator-funcall
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1154 (nth 2 (nth 0 calculator-stack)))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1155 (nthcdr 1 calculator-stack)))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1156 ;; another iteration
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1157 t)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1158 ((and (cdr calculator-stack) ; have two values
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1159 (numberp (nth 0 calculator-stack)) ; both numbers
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1160 (numberp (nth 1 calculator-stack)))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1161 ;; get rid of redundant numbers:
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1162 ;; reduce "... y x" --> "... x"
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1163 ;; needed for 0-ary ops that puts more values
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1164 (setcdr calculator-stack (cdr (cdr calculator-stack))))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1165 (t ;; no more iterations
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1166 nil))))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1167
33491
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
1168 (defun calculator-funcall (f &optional X Y)
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
1169 "If F is a symbol, evaluate (F X Y).
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
1170 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
1171 arguments."
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
1172 ;; remember binary ops for calculator-repR/L
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
1173 (if Y (setq calculator-last-opXY (list f X Y)))
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
1174 (condition-case nil
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
1175 ;; 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
1176 ;; 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
1177 ;; necessary now.
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
1178 (if (symbolp f)
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
1179 (cond ((and X Y) (funcall f X Y))
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
1180 (X (funcall f X))
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
1181 (t (funcall f)))
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
1182 ;; f is an expression
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
1183 (let* ((__f__ f) ; so we can get this value below...
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
1184 (TX (calculator-truncate X))
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
1185 (TY (and Y (calculator-truncate Y)))
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
1186 (DX (if calculator-deg (/ (* X pi) 180) X))
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
1187 (L calculator-saved-list)
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
1188 (Fbound (fboundp 'F))
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
1189 (Fsave (and Fbound (symbol-function 'F)))
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
1190 (Dbound (fboundp 'D))
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
1191 (Dsave (and Dbound (symbol-function 'D))))
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
1192 ;; a shortened version of flet
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
1193 (fset 'F (function
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
1194 (lambda (&optional x y)
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
1195 (calculator-funcall __f__ x y))))
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
1196 (fset 'D (function
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
1197 (lambda (x)
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
1198 (if calculator-deg (/ (* x 180) pi) x))))
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
1199 (unwind-protect (eval f)
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
1200 (if Fbound (fset 'F Fsave) (fmakunbound 'F))
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
1201 (if Dbound (fset 'D Dsave) (fmakunbound 'D)))))
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
1202 (error 0)))
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
1203
27587
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1204 (eval-when-compile ; silence the compiler
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1205 (or (fboundp 'event-key)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1206 (defun event-key (&rest _) nil))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1207 (or (fboundp 'key-press-event-p)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1208 (defun key-press-event-p (&rest _) nil)))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1209
33631
86ab384be9d7 New version from author.
Gerd Moellmann <gerd@gnu.org>
parents: 33551
diff changeset
1210 ;;;---------------------------------------------------------------------
33491
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
1211 ;;; Input interaction
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
1212
27904
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
1213 (defun calculator-last-input (&optional keys)
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
1214 "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
1215 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
1216 (let ((inp (or keys (this-command-keys))))
27587
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1217 (if (or (stringp inp) (not (arrayp inp)))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1218 inp
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1219 ;; 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
1220 ;; lookup operators
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1221 (let* ((i -1) (converted-str (make-string (length inp) ? )) k)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1222 ;; converts an array to a string the ops lookup with keypad
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1223 ;; input
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1224 (while (< (setq i (1+ i)) (length inp))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1225 (setq k (aref inp i))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1226 ;; if Emacs will someday have a event-key, then this would
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1227 ;; probably be modified anyway
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1228 (and (fboundp 'event-key) (key-press-event-p k)
33491
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
1229 (event-key k) (setq k (event-key k)))
27587
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1230 ;; assume all symbols are translatable with an ascii-character
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1231 (and (symbolp k)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1232 (setq k (or (get k 'ascii-character) ? )))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1233 (aset converted-str i k))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1234 converted-str))))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1235
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1236 (defun calculator-clear-fragile (&optional op)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1237 "Clear the fragile flag if it was set, then maybe reset all.
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1238 OP is the operator (if any) that caused this call."
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1239 (if (and calculator-display-fragile
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1240 (or (not op)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1241 (= -1 (calculator-op-arity op))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1242 (= 0 (calculator-op-arity op))))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1243 ;; 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
1244 ;; op
27587
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1245 (calculator-reset))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1246 (setq calculator-display-fragile nil))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1247
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1248 (defun calculator-digit ()
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1249 "Enter a single digit."
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1250 (interactive)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1251 (let ((inp (aref (calculator-last-input) 0)))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1252 (if (and (or calculator-display-fragile
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1253 (not (numberp (car calculator-stack))))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1254 (cond
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1255 ((not calculator-input-radix) (<= inp ?9))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1256 ((eq calculator-input-radix 'bin) (<= inp ?1))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1257 ((eq calculator-input-radix 'oct) (<= inp ?7))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1258 (t t)))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1259 ;; 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
1260 ;; stack
27587
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1261 (progn
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1262 (calculator-clear-fragile)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1263 (let ((digit (upcase (char-to-string inp))))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1264 (if (equal calculator-curnum "0")
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1265 (setq calculator-curnum nil))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1266 (setq calculator-curnum
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1267 (concat (or calculator-curnum "") digit)))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1268 (calculator-update-display)))))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1269
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1270 (defun calculator-decimal ()
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1271 "Enter a decimal period."
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1272 (interactive)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1273 (if (and (not calculator-input-radix)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1274 (or calculator-display-fragile
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1275 (not (numberp (car calculator-stack))))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1276 (not (and calculator-curnum
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1277 (string-match "[.eE]" calculator-curnum))))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1278 ;; 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
1279 ;; period or exponent entered yet
27587
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1280 (progn
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1281 (calculator-clear-fragile)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1282 (setq calculator-curnum (concat (or calculator-curnum "0") "."))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1283 (calculator-update-display))))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1284
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1285 (defun calculator-exp ()
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1286 "Enter an `E' exponent character, or a digit in hex input mode."
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1287 (interactive)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1288 (if calculator-input-radix
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1289 (calculator-digit)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1290 (if (and (or calculator-display-fragile
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1291 (not (numberp (car calculator-stack))))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1292 (not (and calculator-curnum
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1293 (string-match "[eE]" calculator-curnum))))
33491
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
1294 ;; same condition as above, also no E so far
27587
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1295 (progn
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1296 (calculator-clear-fragile)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1297 (setq calculator-curnum (concat (or calculator-curnum "1") "e"))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1298 (calculator-update-display)))))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1299
27904
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
1300 (defun calculator-op (&optional keys)
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
1301 "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
1302 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
1303 (interactive)
33491
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
1304 (catch 'op-error
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
1305 (let* ((last-inp (calculator-last-input keys))
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
1306 (op (assoc last-inp calculator-operators)))
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
1307 (calculator-clear-fragile op)
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
1308 (if (and calculator-curnum (/= (calculator-op-arity op) 0))
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
1309 (setq calculator-stack
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
1310 (cons (calculator-curnum-value) calculator-stack)))
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
1311 (setq calculator-curnum nil)
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
1312 (if (and (= 2 (calculator-op-arity op))
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
1313 (not (and calculator-stack
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
1314 (numberp (nth 0 calculator-stack)))))
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
1315 ;; 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
1316 ;; version
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
1317 (let ((rest-ops calculator-operators))
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
1318 (while (not (equal last-inp (car (car rest-ops))))
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
1319 (setq rest-ops (cdr rest-ops)))
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
1320 (setq op (assoc last-inp (cdr rest-ops)))
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
1321 (if (not (and op (= -1 (calculator-op-arity op))))
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
1322 ;;(error "Binary operator without a first operand")
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
1323 (progn
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
1324 (message "Binary operator without a first operand")
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
1325 (if calculator-electric-mode
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
1326 (progn (sit-for 1) (message nil)))
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
1327 (throw 'op-error nil)))))
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
1328 (calculator-reduce-stack
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
1329 (cond ((eq (nth 1 op) '\() 10)
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
1330 ((eq (nth 1 op) '\)) 0)
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
1331 (t (calculator-op-prec op))))
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
1332 (if (or (and (= -1 (calculator-op-arity op))
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
1333 (numberp (car calculator-stack)))
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
1334 (and (/= (calculator-op-arity op) -1)
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
1335 (/= (calculator-op-arity op) 0)
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
1336 (not (numberp (car calculator-stack)))))
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
1337 ;;(error "Unterminated expression")
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
1338 (progn
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
1339 (message "Unterminated expression")
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
1340 (if calculator-electric-mode
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
1341 (progn (sit-for 1) (message nil)))
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
1342 (throw 'op-error nil)))
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
1343 (setq calculator-stack (cons op calculator-stack))
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
1344 (calculator-reduce-stack (calculator-op-prec op))
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
1345 (and (= (length calculator-stack) 1)
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
1346 (numberp (nth 0 calculator-stack))
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
1347 ;; the display is fragile if it contains only one number
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
1348 (setq calculator-display-fragile t)
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
1349 ;; add number to the saved-list
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
1350 calculator-add-saved
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
1351 (if (= 0 calculator-saved-ptr)
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
1352 (setq calculator-saved-list
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
1353 (cons (car calculator-stack) calculator-saved-list))
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
1354 (let ((p (nthcdr (1- calculator-saved-ptr)
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
1355 calculator-saved-list)))
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
1356 (setcdr p (cons (car calculator-stack) (cdr p))))))
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
1357 (calculator-update-display))))
27587
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1358
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1359 (defun calculator-op-or-exp ()
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1360 "Either enter an operator or a digit.
33491
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
1361 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
1362 no need for negative numbers since these are handled by unary
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
1363 operators)."
27587
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1364 (interactive)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1365 (if (and (not calculator-display-fragile)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1366 calculator-curnum
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1367 (string-match "[eE]$" calculator-curnum))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1368 (calculator-digit)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1369 (calculator-op)))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1370
33631
86ab384be9d7 New version from author.
Gerd Moellmann <gerd@gnu.org>
parents: 33551
diff changeset
1371 ;;;---------------------------------------------------------------------
33491
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
1372 ;;; Input/output modes (not display)
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
1373
27587
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1374 (defun calculator-dec/deg-mode ()
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1375 "Set decimal mode for display & input, if decimal, toggle deg mode."
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1376 (interactive)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1377 (if calculator-curnum
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1378 (setq calculator-stack
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1379 (cons (calculator-curnum-value) calculator-stack)))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1380 (setq calculator-curnum nil)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1381 (if (or calculator-input-radix calculator-output-radix)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1382 (progn (setq calculator-input-radix nil)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1383 (setq calculator-output-radix nil))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1384 ;; already decimal - toggle degrees mode
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1385 (setq calculator-deg (not calculator-deg)))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1386 (calculator-update-display t))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1387
27904
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
1388 (defun calculator-radix-mode (&optional keys)
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
1389 "Set input and display radix modes.
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
1390 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
1391 (interactive)
27904
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
1392 (calculator-radix-input-mode keys)
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
1393 (calculator-radix-output-mode keys))
27587
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1394
27904
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
1395 (defun calculator-radix-input-mode (&optional keys)
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
1396 "Set input radix modes.
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
1397 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
1398 (interactive)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1399 (if calculator-curnum
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1400 (setq calculator-stack
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1401 (cons (calculator-curnum-value) calculator-stack)))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1402 (setq calculator-curnum nil)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1403 (setq calculator-input-radix
27904
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
1404 (let ((inp (calculator-last-input keys)))
27587
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1405 (cdr (assq (upcase (aref inp (1- (length inp))))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1406 calculator-char-radix))))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1407 (calculator-update-display))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1408
27904
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
1409 (defun calculator-radix-output-mode (&optional keys)
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
1410 "Set display radix modes.
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
1411 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
1412 (interactive)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1413 (if calculator-curnum
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1414 (setq calculator-stack
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1415 (cons (calculator-curnum-value) calculator-stack)))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1416 (setq calculator-curnum nil)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1417 (setq calculator-output-radix
27904
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
1418 (let ((inp (calculator-last-input keys)))
27587
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1419 (cdr (assq (upcase (aref inp (1- (length inp))))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1420 calculator-char-radix))))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1421 (calculator-update-display t))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1422
33631
86ab384be9d7 New version from author.
Gerd Moellmann <gerd@gnu.org>
parents: 33551
diff changeset
1423 ;;;---------------------------------------------------------------------
33491
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
1424 ;;; Saved values list
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
1425
27587
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1426 (defun calculator-save-on-list ()
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1427 "Evaluate current expression, put result on the saved values list."
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1428 (interactive)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1429 (let ((calculator-add-saved t)) ; marks the result to be added
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1430 (calculator-enter)))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1431
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1432 (defun calculator-clear-saved ()
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1433 "Clear the list of saved values in `calculator-saved-list'."
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1434 (interactive)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1435 (setq calculator-saved-list nil)
33491
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
1436 (setq calculator-saved-ptr 0)
27587
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1437 (calculator-update-display t))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1438
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1439 (defun calculator-saved-move (n)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1440 "Go N elements up the list of saved values."
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1441 (interactive)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1442 (and calculator-saved-list
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1443 (or (null calculator-stack) calculator-display-fragile)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1444 (progn
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1445 (setq calculator-saved-ptr
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1446 (max (min (+ n calculator-saved-ptr)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1447 (length calculator-saved-list))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1448 0))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1449 (if (nth calculator-saved-ptr calculator-saved-list)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1450 (setq calculator-stack
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1451 (list (nth calculator-saved-ptr calculator-saved-list))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1452 calculator-display-fragile t)
27904
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
1453 (calculator-reset))
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
1454 (calculator-update-display))))
27587
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1455
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1456 (defun calculator-saved-up ()
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1457 "Go up the list of saved values."
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1458 (interactive)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1459 (calculator-saved-move +1))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1460
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1461 (defun calculator-saved-down ()
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1462 "Go down the list of saved values."
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1463 (interactive)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1464 (calculator-saved-move -1))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1465
33631
86ab384be9d7 New version from author.
Gerd Moellmann <gerd@gnu.org>
parents: 33551
diff changeset
1466 ;;;---------------------------------------------------------------------
33491
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
1467 ;;; Misc functions
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
1468
27587
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1469 (defun calculator-open-paren ()
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1470 "Equivalents of `(' use this."
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1471 (interactive)
27904
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
1472 (calculator-op "("))
27587
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1473
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1474 (defun calculator-close-paren ()
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1475 "Equivalents of `)' use this."
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1476 (interactive)
27904
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
1477 (calculator-op ")"))
27587
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1478
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1479 (defun calculator-enter ()
27904
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
1480 "Evaluate current expression."
27587
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1481 (interactive)
27904
af501f05394a (calculator-use-menu): New option.
Gerd Moellmann <gerd@gnu.org>
parents: 27587
diff changeset
1482 (calculator-op "="))
27587
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1483
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1484 (defun calculator-backspace ()
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1485 "Backward delete a single digit or a stack element."
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1486 (interactive)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1487 (if calculator-curnum
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1488 (setq calculator-curnum
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1489 (if (> (length calculator-curnum) 1)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1490 (substring calculator-curnum
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1491 0 (1- (length calculator-curnum)))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1492 nil))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1493 (setq calculator-stack (cdr calculator-stack)))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1494 (calculator-update-display))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1495
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1496 (defun calculator-clear ()
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1497 "Clear current number."
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1498 (interactive)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1499 (setq calculator-curnum nil)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1500 (cond
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1501 ;; if the current number is from the saved-list - remove it
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1502 ((and calculator-display-fragile
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1503 calculator-saved-list
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1504 (= (car calculator-stack)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1505 (nth calculator-saved-ptr calculator-saved-list)))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1506 (if (= 0 calculator-saved-ptr)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1507 (setq calculator-saved-list (cdr calculator-saved-list))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1508 (let ((p (nthcdr (1- calculator-saved-ptr)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1509 calculator-saved-list)))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1510 (setcdr p (cdr (cdr p)))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1511 (setq calculator-saved-ptr (1- calculator-saved-ptr))))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1512 (if calculator-saved-list
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1513 (setq calculator-stack
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1514 (list (nth calculator-saved-ptr calculator-saved-list)))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1515 (calculator-reset)))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1516 ;; reset if fragile or double clear
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1517 ((or calculator-display-fragile (eq last-command this-command))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1518 (calculator-reset)))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1519 (calculator-update-display))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1520
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1521 (defun calculator-copy ()
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1522 "Copy current number to the `kill-ring'."
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1523 (interactive)
39430
48633cf4ce7c (calculator-copy-displayer): New user-option.
Gerd Moellmann <gerd@gnu.org>
parents: 38436
diff changeset
1524 (let ((calculator-displayer
48633cf4ce7c (calculator-copy-displayer): New user-option.
Gerd Moellmann <gerd@gnu.org>
parents: 38436
diff changeset
1525 (or calculator-copy-displayer calculator-displayer))
48633cf4ce7c (calculator-copy-displayer): New user-option.
Gerd Moellmann <gerd@gnu.org>
parents: 38436
diff changeset
1526 (calculator-displayers
48633cf4ce7c (calculator-copy-displayer): New user-option.
Gerd Moellmann <gerd@gnu.org>
parents: 38436
diff changeset
1527 (if calculator-copy-displayer nil calculator-displayers)))
48633cf4ce7c (calculator-copy-displayer): New user-option.
Gerd Moellmann <gerd@gnu.org>
parents: 38436
diff changeset
1528 (calculator-enter)
48633cf4ce7c (calculator-copy-displayer): New user-option.
Gerd Moellmann <gerd@gnu.org>
parents: 38436
diff changeset
1529 ;; remove trailing spaces and and an index
48633cf4ce7c (calculator-copy-displayer): New user-option.
Gerd Moellmann <gerd@gnu.org>
parents: 38436
diff changeset
1530 (let ((s (cdr calculator-stack-display)))
48633cf4ce7c (calculator-copy-displayer): New user-option.
Gerd Moellmann <gerd@gnu.org>
parents: 38436
diff changeset
1531 (and s
48633cf4ce7c (calculator-copy-displayer): New user-option.
Gerd Moellmann <gerd@gnu.org>
parents: 38436
diff changeset
1532 (if (string-match "^\\([^ ]+\\) *\\(\\[[0-9/]+\\]\\)? *$" s)
48633cf4ce7c (calculator-copy-displayer): New user-option.
Gerd Moellmann <gerd@gnu.org>
parents: 38436
diff changeset
1533 (setq s (match-string 1 s)))
48633cf4ce7c (calculator-copy-displayer): New user-option.
Gerd Moellmann <gerd@gnu.org>
parents: 38436
diff changeset
1534 (kill-new s)))))
27587
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1535
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1536 (defun calculator-set-register (reg)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1537 "Set a register value for REG."
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1538 (interactive "cRegister to store into: ")
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1539 (let* ((as (assq reg calculator-registers))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1540 (val (progn (calculator-enter) (car calculator-stack))))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1541 (if as
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1542 (setcdr as val)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1543 (setq calculator-registers
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1544 (cons (cons reg val) calculator-registers)))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1545 (message (format "[%c] := %S" reg val))))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1546
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1547 (defun calculator-put-value (val)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1548 "Paste VAL as if entered.
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1549 Used by `calculator-paste' and `get-register'."
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1550 (if (and (numberp val)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1551 ;; (not calculator-curnum)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1552 (or calculator-display-fragile
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1553 (not (numberp (car calculator-stack)))))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1554 (progn
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1555 (calculator-clear-fragile)
39430
48633cf4ce7c (calculator-copy-displayer): New user-option.
Gerd Moellmann <gerd@gnu.org>
parents: 38436
diff changeset
1556 (setq calculator-curnum (let ((calculator-displayer "%S"))
48633cf4ce7c (calculator-copy-displayer): New user-option.
Gerd Moellmann <gerd@gnu.org>
parents: 38436
diff changeset
1557 (calculator-num-to-string val)))
27587
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1558 (calculator-update-display))))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1559
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1560 (defun calculator-paste ()
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1561 "Paste a value from the `kill-ring'."
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1562 (interactive)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1563 (calculator-put-value
33491
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
1564 (let ((str (current-kill 0)))
33631
86ab384be9d7 New version from author.
Gerd Moellmann <gerd@gnu.org>
parents: 33551
diff changeset
1565 (and calculator-paste-decimals
86ab384be9d7 New version from author.
Gerd Moellmann <gerd@gnu.org>
parents: 33551
diff changeset
1566 (string-match "\\([0-9]+\\)\\(\\.[0-9]+\\)?\\(e[0-9]+\\)?"
86ab384be9d7 New version from author.
Gerd Moellmann <gerd@gnu.org>
parents: 33551
diff changeset
1567 str)
86ab384be9d7 New version from author.
Gerd Moellmann <gerd@gnu.org>
parents: 33551
diff changeset
1568 (or (match-string 1 str)
86ab384be9d7 New version from author.
Gerd Moellmann <gerd@gnu.org>
parents: 33551
diff changeset
1569 (match-string 2 str)
86ab384be9d7 New version from author.
Gerd Moellmann <gerd@gnu.org>
parents: 33551
diff changeset
1570 (match-string 3 str))
86ab384be9d7 New version from author.
Gerd Moellmann <gerd@gnu.org>
parents: 33551
diff changeset
1571 (setq str (concat (match-string 1 str)
86ab384be9d7 New version from author.
Gerd Moellmann <gerd@gnu.org>
parents: 33551
diff changeset
1572 (or (match-string 2 str) ".0")
86ab384be9d7 New version from author.
Gerd Moellmann <gerd@gnu.org>
parents: 33551
diff changeset
1573 (match-string 3 str))))
33491
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
1574 (condition-case nil (car (read-from-string str))
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
1575 (error nil)))))
27587
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1576
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1577 (defun calculator-get-register (reg)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1578 "Get a value from a register REG."
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1579 (interactive "cRegister to get value from: ")
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1580 (calculator-put-value (cdr (assq reg calculator-registers))))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1581
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1582 (defun calculator-help ()
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1583 ;; this is used as the quick reference screen you get with `h'
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1584 "Quick reference:
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1585 * numbers/operators/parens/./e - enter expressions
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1586 + - * / \\(div) %(rem) _(-X,postfix) ;(1/X,postfix) ^(exp) L(og)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1587 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
1588 * >/< 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
1589 * I inverses next trig function * '/\"/{} - display/display args
23166da66d5f New maintainer version.
Dave Love <fx@gnu.org>
parents: 30889
diff changeset
1590 * D - switch to all-decimal, or toggle deg/rad mode
27587
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1591 * 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
1592 * 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
1593 * enter/= - evaluate current expr. * s/g - set/get a register
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1594 * space - evaluate & save on list * l/v - list total/average
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1595 * 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
1596 * C-insert - copy whole expr. * C-return - evaluate, copy, exit
27587
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1597 * insert - paste a number * backspace- delete backwards
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1598 * delete - clear argument or list value or whole expression (twice)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1599 * escape/q - exit."
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1600 (interactive)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1601 (if (eq last-command 'calculator-help)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1602 (let ((mode-name "Calculator")
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1603 (major-mode 'calculator-mode)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1604 (g-map (current-global-map))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1605 (win (selected-window)))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1606 (require 'ehelp)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1607 (if calculator-electric-mode
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1608 (use-global-map calculator-saved-global-map))
33631
86ab384be9d7 New version from author.
Gerd Moellmann <gerd@gnu.org>
parents: 33551
diff changeset
1609 (if (or (not calculator-electric-mode)
86ab384be9d7 New version from author.
Gerd Moellmann <gerd@gnu.org>
parents: 33551
diff changeset
1610 ;; XEmacs has a problem with electric-describe-mode
86ab384be9d7 New version from author.
Gerd Moellmann <gerd@gnu.org>
parents: 33551
diff changeset
1611 (string-match "XEmacs" (emacs-version)))
86ab384be9d7 New version from author.
Gerd Moellmann <gerd@gnu.org>
parents: 33551
diff changeset
1612 (describe-mode)
86ab384be9d7 New version from author.
Gerd Moellmann <gerd@gnu.org>
parents: 33551
diff changeset
1613 (electric-describe-mode))
27587
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1614 (if calculator-electric-mode
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1615 (use-global-map g-map))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1616 (select-window win) ; these are for XEmacs (also below)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1617 (message nil))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1618 (let ((one (one-window-p t))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1619 (win (selected-window))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1620 (help-buf (get-buffer-create "*Help*")))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1621 (save-window-excursion
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1622 (with-output-to-temp-buffer "*Help*"
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1623 (princ (documentation 'calculator-help)))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1624 (if one
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1625 (shrink-window-if-larger-than-buffer
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1626 (get-buffer-window help-buf)))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1627 (message
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1628 "`%s' again for more help, any other key continues normally."
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1629 (calculator-last-input))
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 (sit-for 360))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1632 (select-window win))))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1633
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1634 (defun calculator-quit ()
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1635 "Quit calculator."
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1636 (interactive)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1637 (set-buffer calculator-buffer)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1638 (let ((inhibit-read-only t)) (erase-buffer))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1639 (if (not calculator-electric-mode)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1640 (progn
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1641 (condition-case nil
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1642 (while (get-buffer-window calculator-buffer)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1643 (delete-window (get-buffer-window calculator-buffer)))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1644 (error nil))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1645 (kill-buffer calculator-buffer)))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1646 (setq calculator-buffer nil)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1647 (message "Calculator done.")
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1648 (if calculator-electric-mode (throw 'calculator-done nil)))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1649
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1650 (defun calculator-save-and-quit ()
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1651 "Quit the calculator, saving the result on the `kill-ring'."
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1652 (interactive)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1653 (calculator-enter)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1654 (calculator-copy)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1655 (calculator-quit))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1656
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1657 (defun calculator-repR (x)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1658 "Repeats the last binary operation with its second argument and X.
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1659 To use this, apply a binary operator (evaluate it), then call this."
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1660 (if calculator-last-opXY
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1661 ;; avoid rebinding calculator-last-opXY
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1662 (let ((calculator-last-opXY calculator-last-opXY))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1663 (calculator-funcall
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1664 (car calculator-last-opXY) x (nth 2 calculator-last-opXY)))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1665 x))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1666
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1667 (defun calculator-repL (x)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1668 "Repeats the last binary operation with its first argument and X.
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1669 To use this, apply a binary operator (evaluate it), then call this."
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1670 (if calculator-last-opXY
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1671 ;; avoid rebinding calculator-last-opXY
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1672 (let ((calculator-last-opXY calculator-last-opXY))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1673 (calculator-funcall
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1674 (car calculator-last-opXY) (nth 1 calculator-last-opXY) x))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1675 x))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1676
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1677 (defun calculator-fact (x)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1678 "Simple factorial of X."
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1679 (let ((r (if (<= x 10) 1 1.0)))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1680 (while (> x 0)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1681 (setq r (* r (truncate x)))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1682 (setq x (1- x)))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1683 r))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1684
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1685 (defun calculator-truncate (n)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1686 "Truncate N, return 0 in case of overflow."
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1687 (condition-case nil (truncate n) (error 0)))
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1688
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1689
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1690 (provide 'calculator)
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1691
b529e919efd4 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1692 ;;; calculator.el ends here