annotate lisp/calculator.el @ 42307:922f0ef2951b

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