calc.py

Mon, 04 May 2015 02:19:21 +0300

author
Teemu Piippo <crimsondusk64@gmail.com>
date
Mon, 04 May 2015 02:19:21 +0300
changeset 134
7316dc5f61ef
parent 132
a22c50f52a23
child 135
ad27ab7e6fb6
permissions
-rw-r--r--

Added scientific notation and dice expressions (cheaply as operators)

124
7b2cd8b1ba86 - now with extra license headers
Teemu Piippo <crimsondusk64@gmail.com>
parents: 123
diff changeset
1 '''
7b2cd8b1ba86 - now with extra license headers
Teemu Piippo <crimsondusk64@gmail.com>
parents: 123
diff changeset
2 Copyright 2015 Teemu Piippo
7b2cd8b1ba86 - now with extra license headers
Teemu Piippo <crimsondusk64@gmail.com>
parents: 123
diff changeset
3 All rights reserved.
7b2cd8b1ba86 - now with extra license headers
Teemu Piippo <crimsondusk64@gmail.com>
parents: 123
diff changeset
4
7b2cd8b1ba86 - now with extra license headers
Teemu Piippo <crimsondusk64@gmail.com>
parents: 123
diff changeset
5 Redistribution and use in source and binary forms, with or without
7b2cd8b1ba86 - now with extra license headers
Teemu Piippo <crimsondusk64@gmail.com>
parents: 123
diff changeset
6 modification, are permitted provided that the following conditions
7b2cd8b1ba86 - now with extra license headers
Teemu Piippo <crimsondusk64@gmail.com>
parents: 123
diff changeset
7 are met:
7b2cd8b1ba86 - now with extra license headers
Teemu Piippo <crimsondusk64@gmail.com>
parents: 123
diff changeset
8
7b2cd8b1ba86 - now with extra license headers
Teemu Piippo <crimsondusk64@gmail.com>
parents: 123
diff changeset
9 1. Redistributions of source code must retain the above copyright
7b2cd8b1ba86 - now with extra license headers
Teemu Piippo <crimsondusk64@gmail.com>
parents: 123
diff changeset
10 notice, this list of conditions and the following disclaimer.
7b2cd8b1ba86 - now with extra license headers
Teemu Piippo <crimsondusk64@gmail.com>
parents: 123
diff changeset
11 2. Redistributions in binary form must reproduce the above copyright
7b2cd8b1ba86 - now with extra license headers
Teemu Piippo <crimsondusk64@gmail.com>
parents: 123
diff changeset
12 notice, this list of conditions and the following disclaimer in the
7b2cd8b1ba86 - now with extra license headers
Teemu Piippo <crimsondusk64@gmail.com>
parents: 123
diff changeset
13 documentation and/or other materials provided with the distribution.
7b2cd8b1ba86 - now with extra license headers
Teemu Piippo <crimsondusk64@gmail.com>
parents: 123
diff changeset
14 3. The name of the author may not be used to endorse or promote products
7b2cd8b1ba86 - now with extra license headers
Teemu Piippo <crimsondusk64@gmail.com>
parents: 123
diff changeset
15 derived from this software without specific prior written permission.
7b2cd8b1ba86 - now with extra license headers
Teemu Piippo <crimsondusk64@gmail.com>
parents: 123
diff changeset
16
7b2cd8b1ba86 - now with extra license headers
Teemu Piippo <crimsondusk64@gmail.com>
parents: 123
diff changeset
17 THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
7b2cd8b1ba86 - now with extra license headers
Teemu Piippo <crimsondusk64@gmail.com>
parents: 123
diff changeset
18 IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
7b2cd8b1ba86 - now with extra license headers
Teemu Piippo <crimsondusk64@gmail.com>
parents: 123
diff changeset
19 OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
7b2cd8b1ba86 - now with extra license headers
Teemu Piippo <crimsondusk64@gmail.com>
parents: 123
diff changeset
20 IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
7b2cd8b1ba86 - now with extra license headers
Teemu Piippo <crimsondusk64@gmail.com>
parents: 123
diff changeset
21 INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
7b2cd8b1ba86 - now with extra license headers
Teemu Piippo <crimsondusk64@gmail.com>
parents: 123
diff changeset
22 NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
7b2cd8b1ba86 - now with extra license headers
Teemu Piippo <crimsondusk64@gmail.com>
parents: 123
diff changeset
23 DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
7b2cd8b1ba86 - now with extra license headers
Teemu Piippo <crimsondusk64@gmail.com>
parents: 123
diff changeset
24 THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
7b2cd8b1ba86 - now with extra license headers
Teemu Piippo <crimsondusk64@gmail.com>
parents: 123
diff changeset
25 (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
7b2cd8b1ba86 - now with extra license headers
Teemu Piippo <crimsondusk64@gmail.com>
parents: 123
diff changeset
26 THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
7b2cd8b1ba86 - now with extra license headers
Teemu Piippo <crimsondusk64@gmail.com>
parents: 123
diff changeset
27 '''
7b2cd8b1ba86 - now with extra license headers
Teemu Piippo <crimsondusk64@gmail.com>
parents: 123
diff changeset
28
123
aeb0d0788869 - added commits.db and mercurial support restructure
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
29 import re
aeb0d0788869 - added commits.db and mercurial support restructure
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
30 import cmath
aeb0d0788869 - added commits.db and mercurial support restructure
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
31 import math
aeb0d0788869 - added commits.db and mercurial support restructure
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
32 import random
aeb0d0788869 - added commits.db and mercurial support restructure
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
33 import time
aeb0d0788869 - added commits.db and mercurial support restructure
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
34 import operator
125
c44b1aa85257 - added hex support to the calculator
Teemu Piippo <crimsondusk64@gmail.com>
parents: 124
diff changeset
35 import string
123
aeb0d0788869 - added commits.db and mercurial support restructure
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
36 from copy import deepcopy
aeb0d0788869 - added commits.db and mercurial support restructure
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
37
aeb0d0788869 - added commits.db and mercurial support restructure
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
38 epsilon = 1e-10
aeb0d0788869 - added commits.db and mercurial support restructure
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
39
aeb0d0788869 - added commits.db and mercurial support restructure
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
40 # http://stackoverflow.com/a/2182437
aeb0d0788869 - added commits.db and mercurial support restructure
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
41 class Enum (set):
aeb0d0788869 - added commits.db and mercurial support restructure
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
42 def __init__ (self, *args):
aeb0d0788869 - added commits.db and mercurial support restructure
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
43 super (Enum, self).__init__ (args)
aeb0d0788869 - added commits.db and mercurial support restructure
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
44
aeb0d0788869 - added commits.db and mercurial support restructure
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
45 def __getattr__ (self, name):
aeb0d0788869 - added commits.db and mercurial support restructure
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
46 if name in self:
aeb0d0788869 - added commits.db and mercurial support restructure
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
47 return name
aeb0d0788869 - added commits.db and mercurial support restructure
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
48 raise AttributeError
aeb0d0788869 - added commits.db and mercurial support restructure
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
49
aeb0d0788869 - added commits.db and mercurial support restructure
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
50 def __setattr__ (self, name, value):
aeb0d0788869 - added commits.db and mercurial support restructure
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
51 raise AttributeError
aeb0d0788869 - added commits.db and mercurial support restructure
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
52
aeb0d0788869 - added commits.db and mercurial support restructure
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
53 class Operator (object):
aeb0d0788869 - added commits.db and mercurial support restructure
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
54 def __init__ (self, name, symbol, operands, priority, function):
aeb0d0788869 - added commits.db and mercurial support restructure
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
55 self.name = name
aeb0d0788869 - added commits.db and mercurial support restructure
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
56 self.symbol = symbol
aeb0d0788869 - added commits.db and mercurial support restructure
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
57 self.operands = operands
aeb0d0788869 - added commits.db and mercurial support restructure
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
58 self.priority = priority
aeb0d0788869 - added commits.db and mercurial support restructure
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
59 self.function = function
aeb0d0788869 - added commits.db and mercurial support restructure
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
60
aeb0d0788869 - added commits.db and mercurial support restructure
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
61 def __str__ (self):
aeb0d0788869 - added commits.db and mercurial support restructure
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
62 return '''<operator %s>''' % self.name
aeb0d0788869 - added commits.db and mercurial support restructure
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
63
aeb0d0788869 - added commits.db and mercurial support restructure
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
64 def __repr__ (self):
aeb0d0788869 - added commits.db and mercurial support restructure
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
65 return self.__str__()
aeb0d0788869 - added commits.db and mercurial support restructure
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
66
aeb0d0788869 - added commits.db and mercurial support restructure
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
67 class FunctionCall (object):
aeb0d0788869 - added commits.db and mercurial support restructure
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
68 def __init__ (self, funcname, args):
aeb0d0788869 - added commits.db and mercurial support restructure
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
69 assert (type(args) is list)
aeb0d0788869 - added commits.db and mercurial support restructure
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
70 self.funcname = funcname
aeb0d0788869 - added commits.db and mercurial support restructure
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
71 self.args = args
aeb0d0788869 - added commits.db and mercurial support restructure
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
72
aeb0d0788869 - added commits.db and mercurial support restructure
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
73 def __str__ (self):
aeb0d0788869 - added commits.db and mercurial support restructure
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
74 return '''<function %s (%s)>''' % (self.funcname, self.args)
aeb0d0788869 - added commits.db and mercurial support restructure
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
75
aeb0d0788869 - added commits.db and mercurial support restructure
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
76 def __repr__ (self):
aeb0d0788869 - added commits.db and mercurial support restructure
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
77 return self.__str__()
aeb0d0788869 - added commits.db and mercurial support restructure
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
78
aeb0d0788869 - added commits.db and mercurial support restructure
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
79 def do_realf (func, *args):
aeb0d0788869 - added commits.db and mercurial support restructure
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
80 for x in args:
aeb0d0788869 - added commits.db and mercurial support restructure
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
81 if x.imag:
aeb0d0788869 - added commits.db and mercurial support restructure
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
82 raise ValueError ('%s called with a complex number' % func.__name__)
aeb0d0788869 - added commits.db and mercurial support restructure
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
83
aeb0d0788869 - added commits.db and mercurial support restructure
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
84 return func (*[x.real for x in args])
aeb0d0788869 - added commits.db and mercurial support restructure
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
85
aeb0d0788869 - added commits.db and mercurial support restructure
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
86 def do_intf (func, *args):
aeb0d0788869 - added commits.db and mercurial support restructure
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
87 for x in args:
aeb0d0788869 - added commits.db and mercurial support restructure
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
88 if x.imag:
aeb0d0788869 - added commits.db and mercurial support restructure
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
89 raise ValueError ('%s called with a complex number' % func.__name__)
aeb0d0788869 - added commits.db and mercurial support restructure
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
90
aeb0d0788869 - added commits.db and mercurial support restructure
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
91 if x.real - math.floor (x.real):
aeb0d0788869 - added commits.db and mercurial support restructure
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
92 raise ValueError ('%s called with a floating point number' % func.__name__)
aeb0d0788869 - added commits.db and mercurial support restructure
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
93
aeb0d0788869 - added commits.db and mercurial support restructure
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
94 return func (*[int (x.real) for x in args])
aeb0d0788869 - added commits.db and mercurial support restructure
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
95
aeb0d0788869 - added commits.db and mercurial support restructure
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
96 def realf (func):
aeb0d0788869 - added commits.db and mercurial support restructure
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
97 return lambda *args: do_realf (func, *args)
aeb0d0788869 - added commits.db and mercurial support restructure
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
98
aeb0d0788869 - added commits.db and mercurial support restructure
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
99 def intf (func):
aeb0d0788869 - added commits.db and mercurial support restructure
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
100 return lambda *args: do_intf (func, *args)
aeb0d0788869 - added commits.db and mercurial support restructure
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
101
134
7316dc5f61ef Added scientific notation and dice expressions (cheaply as operators)
Teemu Piippo <crimsondusk64@gmail.com>
parents: 132
diff changeset
102 def dice (numRolls, maxValue):
7316dc5f61ef Added scientific notation and dice expressions (cheaply as operators)
Teemu Piippo <crimsondusk64@gmail.com>
parents: 132
diff changeset
103 sumValue = 0
7316dc5f61ef Added scientific notation and dice expressions (cheaply as operators)
Teemu Piippo <crimsondusk64@gmail.com>
parents: 132
diff changeset
104
7316dc5f61ef Added scientific notation and dice expressions (cheaply as operators)
Teemu Piippo <crimsondusk64@gmail.com>
parents: 132
diff changeset
105 for i in range (0, numRolls):
7316dc5f61ef Added scientific notation and dice expressions (cheaply as operators)
Teemu Piippo <crimsondusk64@gmail.com>
parents: 132
diff changeset
106 sumValue += int (random.random() * maxValue) + 1
7316dc5f61ef Added scientific notation and dice expressions (cheaply as operators)
Teemu Piippo <crimsondusk64@gmail.com>
parents: 132
diff changeset
107
7316dc5f61ef Added scientific notation and dice expressions (cheaply as operators)
Teemu Piippo <crimsondusk64@gmail.com>
parents: 132
diff changeset
108 return sumValue
7316dc5f61ef Added scientific notation and dice expressions (cheaply as operators)
Teemu Piippo <crimsondusk64@gmail.com>
parents: 132
diff changeset
109
7316dc5f61ef Added scientific notation and dice expressions (cheaply as operators)
Teemu Piippo <crimsondusk64@gmail.com>
parents: 132
diff changeset
110 def scientific (mantissa, exp):
7316dc5f61ef Added scientific notation and dice expressions (cheaply as operators)
Teemu Piippo <crimsondusk64@gmail.com>
parents: 132
diff changeset
111 return mantissa * 10 ** exp
7316dc5f61ef Added scientific notation and dice expressions (cheaply as operators)
Teemu Piippo <crimsondusk64@gmail.com>
parents: 132
diff changeset
112
123
aeb0d0788869 - added commits.db and mercurial support restructure
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
113 Operators = []
aeb0d0788869 - added commits.db and mercurial support restructure
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
114 OperatorData = {
134
7316dc5f61ef Added scientific notation and dice expressions (cheaply as operators)
Teemu Piippo <crimsondusk64@gmail.com>
parents: 132
diff changeset
115 'sci': { 'symbol': 'e', 'operands': 2, 'priority': 1, 'function': intf (scientific) },
7316dc5f61ef Added scientific notation and dice expressions (cheaply as operators)
Teemu Piippo <crimsondusk64@gmail.com>
parents: 132
diff changeset
116 'dice': { 'symbol': 'd', 'operands': 2, 'priority': 2, 'function': intf (dice) },
7316dc5f61ef Added scientific notation and dice expressions (cheaply as operators)
Teemu Piippo <crimsondusk64@gmail.com>
parents: 132
diff changeset
117 'not': { 'symbol': '!', 'operands': 1, 'priority': 5, 'function': lambda x: not x },
123
aeb0d0788869 - added commits.db and mercurial support restructure
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
118 'compl': { 'symbol': '~', 'operands': 1, 'priority': 5, 'function': intf (operator.inv) },
aeb0d0788869 - added commits.db and mercurial support restructure
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
119 'neg': { 'symbol': '-', 'operands': 1, 'priority': 5, 'function': lambda x: -x },
aeb0d0788869 - added commits.db and mercurial support restructure
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
120 'pow': { 'symbol': '**', 'operands': 2, 'priority': 10, 'function': lambda x, y: x ** y },
aeb0d0788869 - added commits.db and mercurial support restructure
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
121 'mul': { 'symbol': '*', 'operands': 2, 'priority': 50, 'function': lambda x, y: x * y },
aeb0d0788869 - added commits.db and mercurial support restructure
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
122 'div': { 'symbol': '/', 'operands': 2, 'priority': 50, 'function': lambda x, y: x / y },
aeb0d0788869 - added commits.db and mercurial support restructure
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
123 'mod': { 'symbol': '%', 'operands': 2, 'priority': 50, 'function': lambda x, y: math.fmod (x, y) },
aeb0d0788869 - added commits.db and mercurial support restructure
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
124 'add': { 'symbol': '+', 'operands': 2, 'priority': 100, 'function': lambda x, y: x + y },
aeb0d0788869 - added commits.db and mercurial support restructure
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
125 'sub': { 'symbol': '-', 'operands': 2, 'priority': 100, 'function': lambda x, y: x - y },
aeb0d0788869 - added commits.db and mercurial support restructure
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
126 'eq': { 'symbol': '==', 'operands': 2, 'priority': 500, 'function': lambda x, y: x == y },
aeb0d0788869 - added commits.db and mercurial support restructure
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
127 'neq': { 'symbol': '!=', 'operands': 2, 'priority': 500, 'function': lambda x, y: x != y },
aeb0d0788869 - added commits.db and mercurial support restructure
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
128 'lt': { 'symbol': '<', 'operands': 2, 'priority': 500, 'function': lambda x, y: x < y },
aeb0d0788869 - added commits.db and mercurial support restructure
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
129 'lteq': { 'symbol': '<=', 'operands': 2, 'priority': 500, 'function': lambda x, y: x <= y },
aeb0d0788869 - added commits.db and mercurial support restructure
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
130 'gt': { 'symbol': '>', 'operands': 2, 'priority': 500, 'function': lambda x, y: x > y },
aeb0d0788869 - added commits.db and mercurial support restructure
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
131 'gteq': { 'symbol': '>=', 'operands': 2, 'priority': 500, 'function': lambda x, y: x >= y },
aeb0d0788869 - added commits.db and mercurial support restructure
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
132 'btand': { 'symbol': '&', 'operands': 2, 'priority': 600, 'function': intf (operator.and_) },
aeb0d0788869 - added commits.db and mercurial support restructure
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
133 'btxor': { 'symbol': '^', 'operands': 2, 'priority': 601, 'function': intf (operator.xor) },
aeb0d0788869 - added commits.db and mercurial support restructure
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
134 'btor': { 'symbol': '|', 'operands': 2, 'priority': 602, 'function': intf (operator.or_) },
aeb0d0788869 - added commits.db and mercurial support restructure
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
135 'and': { 'symbol': '&&', 'operands': 2, 'priority': 603, 'function': lambda x, y: x and y },
aeb0d0788869 - added commits.db and mercurial support restructure
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
136 'or': { 'symbol': '||', 'operands': 2, 'priority': 604, 'function': lambda x, y: x or y },
aeb0d0788869 - added commits.db and mercurial support restructure
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
137 }
aeb0d0788869 - added commits.db and mercurial support restructure
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
138
aeb0d0788869 - added commits.db and mercurial support restructure
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
139 for name, data in OperatorData.iteritems():
aeb0d0788869 - added commits.db and mercurial support restructure
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
140 Operators.append (Operator (name=name, symbol=data['symbol'], operands=data['operands'],
aeb0d0788869 - added commits.db and mercurial support restructure
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
141 priority=data['priority'], function=data['function']))
aeb0d0788869 - added commits.db and mercurial support restructure
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
142
aeb0d0788869 - added commits.db and mercurial support restructure
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
143 OperatorSymbols={}
aeb0d0788869 - added commits.db and mercurial support restructure
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
144 for op in Operators:
aeb0d0788869 - added commits.db and mercurial support restructure
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
145 if op.symbol in OperatorSymbols:
aeb0d0788869 - added commits.db and mercurial support restructure
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
146 OperatorSymbols[op.symbol].append (op)
aeb0d0788869 - added commits.db and mercurial support restructure
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
147 else:
aeb0d0788869 - added commits.db and mercurial support restructure
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
148 OperatorSymbols[op.symbol] = [op]
aeb0d0788869 - added commits.db and mercurial support restructure
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
149
131
7349e9c6176b Added sgn(x) to .calc
Teemu Piippo <crimsondusk64@gmail.com>
parents: 130
diff changeset
150 def sgn (x):
7349e9c6176b Added sgn(x) to .calc
Teemu Piippo <crimsondusk64@gmail.com>
parents: 130
diff changeset
151 return cmp (x, 0)
7349e9c6176b Added sgn(x) to .calc
Teemu Piippo <crimsondusk64@gmail.com>
parents: 130
diff changeset
152
123
aeb0d0788869 - added commits.db and mercurial support restructure
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
153 Constants = {
aeb0d0788869 - added commits.db and mercurial support restructure
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
154 'pi': cmath.pi,
aeb0d0788869 - added commits.db and mercurial support restructure
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
155 'e': cmath.e,
aeb0d0788869 - added commits.db and mercurial support restructure
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
156 'phi': 1.6180339887498948482,
aeb0d0788869 - added commits.db and mercurial support restructure
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
157 'epsilon': epsilon,
132
a22c50f52a23 lots of new stuff
Teemu Piippo <crimsondusk64@gmail.com>
parents: 131
diff changeset
158 'potato': cmath.sqrt(8) / 3,
123
aeb0d0788869 - added commits.db and mercurial support restructure
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
159 }
aeb0d0788869 - added commits.db and mercurial support restructure
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
160
aeb0d0788869 - added commits.db and mercurial support restructure
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
161 random.seed (time.time())
aeb0d0788869 - added commits.db and mercurial support restructure
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
162
aeb0d0788869 - added commits.db and mercurial support restructure
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
163 Functions = {
aeb0d0788869 - added commits.db and mercurial support restructure
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
164 'round': { 'function': realf (round) },
aeb0d0788869 - added commits.db and mercurial support restructure
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
165 'floor': { 'function': realf (math.floor) },
aeb0d0788869 - added commits.db and mercurial support restructure
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
166 'ceil': { 'function': realf (math.ceil) },
aeb0d0788869 - added commits.db and mercurial support restructure
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
167 'fact': { 'function': intf (math.factorial) },
aeb0d0788869 - added commits.db and mercurial support restructure
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
168 'abs': { 'function': realf (math.fabs) },
aeb0d0788869 - added commits.db and mercurial support restructure
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
169 'degrees': { 'function': realf (math.degrees) },
aeb0d0788869 - added commits.db and mercurial support restructure
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
170 'radians': { 'function': realf (math.radians) },
aeb0d0788869 - added commits.db and mercurial support restructure
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
171 'erf': { 'function': realf (math.erf) },
aeb0d0788869 - added commits.db and mercurial support restructure
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
172 'erfc': { 'function': realf (math.erfc) },
aeb0d0788869 - added commits.db and mercurial support restructure
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
173 'gamma': { 'function': realf (math.gamma) },
aeb0d0788869 - added commits.db and mercurial support restructure
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
174 'lgamma': { 'function': realf (math.lgamma) },
aeb0d0788869 - added commits.db and mercurial support restructure
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
175 'sqrt': { 'function': cmath.sqrt },
aeb0d0788869 - added commits.db and mercurial support restructure
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
176 'ln': { 'function': cmath.log },
aeb0d0788869 - added commits.db and mercurial support restructure
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
177 'log': { 'function': cmath.log10 },
aeb0d0788869 - added commits.db and mercurial support restructure
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
178 'sin': { 'function': cmath.sin },
aeb0d0788869 - added commits.db and mercurial support restructure
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
179 'sinh': { 'function': cmath.sinh },
aeb0d0788869 - added commits.db and mercurial support restructure
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
180 'asin': { 'function': cmath.asin },
aeb0d0788869 - added commits.db and mercurial support restructure
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
181 'asinh': { 'function': cmath.asinh },
aeb0d0788869 - added commits.db and mercurial support restructure
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
182 'cos': { 'function': cmath.cos },
aeb0d0788869 - added commits.db and mercurial support restructure
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
183 'cosh': { 'function': cmath.cosh },
aeb0d0788869 - added commits.db and mercurial support restructure
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
184 'acos': { 'function': cmath.acos },
aeb0d0788869 - added commits.db and mercurial support restructure
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
185 'acosh': { 'function': cmath.acosh },
aeb0d0788869 - added commits.db and mercurial support restructure
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
186 'tan': { 'function': cmath.tan },
aeb0d0788869 - added commits.db and mercurial support restructure
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
187 'tanh': { 'function': cmath.tanh },
aeb0d0788869 - added commits.db and mercurial support restructure
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
188 'atan': { 'function': cmath.atan },
aeb0d0788869 - added commits.db and mercurial support restructure
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
189 'atanh': { 'function': cmath.atanh },
aeb0d0788869 - added commits.db and mercurial support restructure
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
190 'exp': { 'function': cmath.exp },
aeb0d0788869 - added commits.db and mercurial support restructure
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
191 'phase': { 'function': cmath.phase },
aeb0d0788869 - added commits.db and mercurial support restructure
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
192 'lg': { 'function': lambda x: cmath.log (x, 2) },
aeb0d0788869 - added commits.db and mercurial support restructure
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
193 're': { 'function': lambda x: x.real },
aeb0d0788869 - added commits.db and mercurial support restructure
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
194 'im': { 'function': lambda x: x.imag },
aeb0d0788869 - added commits.db and mercurial support restructure
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
195 'conjugate':{ 'function': lambda x: x.conjugate() },
aeb0d0788869 - added commits.db and mercurial support restructure
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
196 'rand': { 'function': random.random },
131
7349e9c6176b Added sgn(x) to .calc
Teemu Piippo <crimsondusk64@gmail.com>
parents: 130
diff changeset
197 'sgn': { 'function': realf (sgn) },
123
aeb0d0788869 - added commits.db and mercurial support restructure
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
198 }
aeb0d0788869 - added commits.db and mercurial support restructure
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
199
aeb0d0788869 - added commits.db and mercurial support restructure
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
200 Tokens = ['(', ')']
aeb0d0788869 - added commits.db and mercurial support restructure
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
201
aeb0d0788869 - added commits.db and mercurial support restructure
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
202 # Symbol table
aeb0d0788869 - added commits.db and mercurial support restructure
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
203 SymbolType = Enum ('CONSTANT', 'FUNCTION', 'OPERATOR', 'TOKEN')
aeb0d0788869 - added commits.db and mercurial support restructure
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
204 SymbolTypes = {}
aeb0d0788869 - added commits.db and mercurial support restructure
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
205 Symbols = []
aeb0d0788869 - added commits.db and mercurial support restructure
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
206
aeb0d0788869 - added commits.db and mercurial support restructure
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
207 for name, value in Constants.iteritems():
aeb0d0788869 - added commits.db and mercurial support restructure
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
208 Symbols.append (name)
aeb0d0788869 - added commits.db and mercurial support restructure
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
209 SymbolTypes[name] = SymbolType.CONSTANT
aeb0d0788869 - added commits.db and mercurial support restructure
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
210
aeb0d0788869 - added commits.db and mercurial support restructure
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
211 for name, data in Functions.iteritems():
aeb0d0788869 - added commits.db and mercurial support restructure
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
212 Symbols.append (name)
aeb0d0788869 - added commits.db and mercurial support restructure
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
213 SymbolTypes[name] = SymbolType.FUNCTION
aeb0d0788869 - added commits.db and mercurial support restructure
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
214
aeb0d0788869 - added commits.db and mercurial support restructure
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
215 for op in Operators:
aeb0d0788869 - added commits.db and mercurial support restructure
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
216 if op.symbol not in Symbols:
aeb0d0788869 - added commits.db and mercurial support restructure
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
217 Symbols.append (op.symbol)
aeb0d0788869 - added commits.db and mercurial support restructure
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
218 SymbolTypes[op.symbol] = SymbolType.OPERATOR
aeb0d0788869 - added commits.db and mercurial support restructure
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
219
aeb0d0788869 - added commits.db and mercurial support restructure
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
220 for name in Tokens:
aeb0d0788869 - added commits.db and mercurial support restructure
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
221 SymbolTypes[name] = SymbolType.TOKEN
aeb0d0788869 - added commits.db and mercurial support restructure
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
222
aeb0d0788869 - added commits.db and mercurial support restructure
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
223 Symbols += Tokens
aeb0d0788869 - added commits.db and mercurial support restructure
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
224 Symbols = sorted (Symbols, key=lambda x: len (x), reverse=True)
126
0fc519afba89 - added binary support for calc
Teemu Piippo <crimsondusk64@gmail.com>
parents: 125
diff changeset
225 PreferredBase = 10
123
aeb0d0788869 - added commits.db and mercurial support restructure
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
226
128
bd949c554dd2 Major refactor: moved calculator routines into a Calculator class.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 127
diff changeset
227 def set_preferred_base(x):
126
0fc519afba89 - added binary support for calc
Teemu Piippo <crimsondusk64@gmail.com>
parents: 125
diff changeset
228 global PreferredBase
128
bd949c554dd2 Major refactor: moved calculator routines into a Calculator class.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 127
diff changeset
229 PreferredBase = x
123
aeb0d0788869 - added commits.db and mercurial support restructure
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
230
aeb0d0788869 - added commits.db and mercurial support restructure
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
231 def rindex (li, value):
aeb0d0788869 - added commits.db and mercurial support restructure
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
232 return (len(li) - 1) - li[::-1].index(value)
aeb0d0788869 - added commits.db and mercurial support restructure
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
233
aeb0d0788869 - added commits.db and mercurial support restructure
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
234 def realPrint (x):
aeb0d0788869 - added commits.db and mercurial support restructure
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
235 print x
aeb0d0788869 - added commits.db and mercurial support restructure
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
236
128
bd949c554dd2 Major refactor: moved calculator routines into a Calculator class.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 127
diff changeset
237 Attributes = {
bd949c554dd2 Major refactor: moved calculator routines into a Calculator class.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 127
diff changeset
238 'hex': lambda self: self.set_preferred_base (0x10),
bd949c554dd2 Major refactor: moved calculator routines into a Calculator class.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 127
diff changeset
239 'binary': lambda self: self.set_preferred_base (0b10),
bd949c554dd2 Major refactor: moved calculator routines into a Calculator class.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 127
diff changeset
240 'decimal': lambda self: self.set_preferred_base (10),
bd949c554dd2 Major refactor: moved calculator routines into a Calculator class.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 127
diff changeset
241 }
bd949c554dd2 Major refactor: moved calculator routines into a Calculator class.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 127
diff changeset
242
bd949c554dd2 Major refactor: moved calculator routines into a Calculator class.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 127
diff changeset
243 Attributes['bin'] = Attributes['binary']
bd949c554dd2 Major refactor: moved calculator routines into a Calculator class.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 127
diff changeset
244 Attributes['dec'] = Attributes['decimal']
bd949c554dd2 Major refactor: moved calculator routines into a Calculator class.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 127
diff changeset
245 AttributeNames = sorted ([key for key in Attributes], key=lambda x:len(x), reverse=True)
bd949c554dd2 Major refactor: moved calculator routines into a Calculator class.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 127
diff changeset
246
bd949c554dd2 Major refactor: moved calculator routines into a Calculator class.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 127
diff changeset
247 class Calculator (object):
bd949c554dd2 Major refactor: moved calculator routines into a Calculator class.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 127
diff changeset
248 def __init__ (self):
bd949c554dd2 Major refactor: moved calculator routines into a Calculator class.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 127
diff changeset
249 self.preferred_base = None
bd949c554dd2 Major refactor: moved calculator routines into a Calculator class.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 127
diff changeset
250
bd949c554dd2 Major refactor: moved calculator routines into a Calculator class.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 127
diff changeset
251 def set_preferred_base (self, x):
bd949c554dd2 Major refactor: moved calculator routines into a Calculator class.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 127
diff changeset
252 self.preferred_base = x
bd949c554dd2 Major refactor: moved calculator routines into a Calculator class.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 127
diff changeset
253
130
c82cef747008 - reverted previous commit (now that was a bad idea)
Teemu Piippo <crimsondusk64@gmail.com>
parents: 129
diff changeset
254 def trim_spaces (self, expr):
c82cef747008 - reverted previous commit (now that was a bad idea)
Teemu Piippo <crimsondusk64@gmail.com>
parents: 129
diff changeset
255 return re.sub ('\s+', '', expr.strip())
128
bd949c554dd2 Major refactor: moved calculator routines into a Calculator class.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 127
diff changeset
256
130
c82cef747008 - reverted previous commit (now that was a bad idea)
Teemu Piippo <crimsondusk64@gmail.com>
parents: 129
diff changeset
257 def parse_attributes (self, expr):
c82cef747008 - reverted previous commit (now that was a bad idea)
Teemu Piippo <crimsondusk64@gmail.com>
parents: 129
diff changeset
258 if expr[0] != '<':
c82cef747008 - reverted previous commit (now that was a bad idea)
Teemu Piippo <crimsondusk64@gmail.com>
parents: 129
diff changeset
259 return expr
128
bd949c554dd2 Major refactor: moved calculator routines into a Calculator class.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 127
diff changeset
260
bd949c554dd2 Major refactor: moved calculator routines into a Calculator class.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 127
diff changeset
261 i = 1
130
c82cef747008 - reverted previous commit (now that was a bad idea)
Teemu Piippo <crimsondusk64@gmail.com>
parents: 129
diff changeset
262 while expr[i] != '>':
c82cef747008 - reverted previous commit (now that was a bad idea)
Teemu Piippo <crimsondusk64@gmail.com>
parents: 129
diff changeset
263 if expr[i] == '|':
128
bd949c554dd2 Major refactor: moved calculator routines into a Calculator class.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 127
diff changeset
264 i += 1
bd949c554dd2 Major refactor: moved calculator routines into a Calculator class.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 127
diff changeset
265
bd949c554dd2 Major refactor: moved calculator routines into a Calculator class.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 127
diff changeset
266 for name in AttributeNames:
130
c82cef747008 - reverted previous commit (now that was a bad idea)
Teemu Piippo <crimsondusk64@gmail.com>
parents: 129
diff changeset
267 if expr[i:i + len(name)] == name:
128
bd949c554dd2 Major refactor: moved calculator routines into a Calculator class.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 127
diff changeset
268 Attributes[name] (self)
bd949c554dd2 Major refactor: moved calculator routines into a Calculator class.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 127
diff changeset
269 i += len(name)
123
aeb0d0788869 - added commits.db and mercurial support restructure
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
270
130
c82cef747008 - reverted previous commit (now that was a bad idea)
Teemu Piippo <crimsondusk64@gmail.com>
parents: 129
diff changeset
271 if expr[i] == '>':
128
bd949c554dd2 Major refactor: moved calculator routines into a Calculator class.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 127
diff changeset
272 break
bd949c554dd2 Major refactor: moved calculator routines into a Calculator class.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 127
diff changeset
273
130
c82cef747008 - reverted previous commit (now that was a bad idea)
Teemu Piippo <crimsondusk64@gmail.com>
parents: 129
diff changeset
274 if expr[i] != '|':
128
bd949c554dd2 Major refactor: moved calculator routines into a Calculator class.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 127
diff changeset
275 raise ValueError ('malformed attributes')
bd949c554dd2 Major refactor: moved calculator routines into a Calculator class.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 127
diff changeset
276 break
bd949c554dd2 Major refactor: moved calculator routines into a Calculator class.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 127
diff changeset
277 else:
130
c82cef747008 - reverted previous commit (now that was a bad idea)
Teemu Piippo <crimsondusk64@gmail.com>
parents: 129
diff changeset
278 raise ValueError ('bad attributes: %s' % expr[i:])
128
bd949c554dd2 Major refactor: moved calculator routines into a Calculator class.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 127
diff changeset
279
130
c82cef747008 - reverted previous commit (now that was a bad idea)
Teemu Piippo <crimsondusk64@gmail.com>
parents: 129
diff changeset
280 return expr[i + 1:]
128
bd949c554dd2 Major refactor: moved calculator routines into a Calculator class.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 127
diff changeset
281
130
c82cef747008 - reverted previous commit (now that was a bad idea)
Teemu Piippo <crimsondusk64@gmail.com>
parents: 129
diff changeset
282 def parse_number (self, expr):
c82cef747008 - reverted previous commit (now that was a bad idea)
Teemu Piippo <crimsondusk64@gmail.com>
parents: 129
diff changeset
283 """Tries to parse a number from the expression. Returns (value, length) on success."""
128
bd949c554dd2 Major refactor: moved calculator routines into a Calculator class.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 127
diff changeset
284 i = 0
bd949c554dd2 Major refactor: moved calculator routines into a Calculator class.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 127
diff changeset
285 value = None
bd949c554dd2 Major refactor: moved calculator routines into a Calculator class.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 127
diff changeset
286 base = 10
123
aeb0d0788869 - added commits.db and mercurial support restructure
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
287
128
bd949c554dd2 Major refactor: moved calculator routines into a Calculator class.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 127
diff changeset
288 # Possibly it's hexadecimal
130
c82cef747008 - reverted previous commit (now that was a bad idea)
Teemu Piippo <crimsondusk64@gmail.com>
parents: 129
diff changeset
289 if expr[0:2].lower() == '0x':
128
bd949c554dd2 Major refactor: moved calculator routines into a Calculator class.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 127
diff changeset
290 base = 0x10
bd949c554dd2 Major refactor: moved calculator routines into a Calculator class.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 127
diff changeset
291 digits = string.hexdigits
bd949c554dd2 Major refactor: moved calculator routines into a Calculator class.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 127
diff changeset
292 digitname = 'hexit'
bd949c554dd2 Major refactor: moved calculator routines into a Calculator class.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 127
diff changeset
293 i = 2
130
c82cef747008 - reverted previous commit (now that was a bad idea)
Teemu Piippo <crimsondusk64@gmail.com>
parents: 129
diff changeset
294 elif expr[0:2].lower() == '0b':
128
bd949c554dd2 Major refactor: moved calculator routines into a Calculator class.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 127
diff changeset
295 base = 0b10
bd949c554dd2 Major refactor: moved calculator routines into a Calculator class.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 127
diff changeset
296 digits = ['0', '1']
bd949c554dd2 Major refactor: moved calculator routines into a Calculator class.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 127
diff changeset
297 digitname = 'bit'
bd949c554dd2 Major refactor: moved calculator routines into a Calculator class.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 127
diff changeset
298 i = 2
bd949c554dd2 Major refactor: moved calculator routines into a Calculator class.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 127
diff changeset
299
bd949c554dd2 Major refactor: moved calculator routines into a Calculator class.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 127
diff changeset
300 if base != 10:
bd949c554dd2 Major refactor: moved calculator routines into a Calculator class.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 127
diff changeset
301 if not self.preferred_base:
bd949c554dd2 Major refactor: moved calculator routines into a Calculator class.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 127
diff changeset
302 self.preferred_base = base
134
7316dc5f61ef Added scientific notation and dice expressions (cheaply as operators)
Teemu Piippo <crimsondusk64@gmail.com>
parents: 132
diff changeset
303
128
bd949c554dd2 Major refactor: moved calculator routines into a Calculator class.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 127
diff changeset
304 # Skip leading zeroes
130
c82cef747008 - reverted previous commit (now that was a bad idea)
Teemu Piippo <crimsondusk64@gmail.com>
parents: 129
diff changeset
305 while i < len (expr) and expr[i] == '0':
128
bd949c554dd2 Major refactor: moved calculator routines into a Calculator class.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 127
diff changeset
306 i += 1
123
aeb0d0788869 - added commits.db and mercurial support restructure
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
307
128
bd949c554dd2 Major refactor: moved calculator routines into a Calculator class.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 127
diff changeset
308 startingIndex = i
130
c82cef747008 - reverted previous commit (now that was a bad idea)
Teemu Piippo <crimsondusk64@gmail.com>
parents: 129
diff changeset
309 while i < len (expr) and expr[i] in digits:
128
bd949c554dd2 Major refactor: moved calculator routines into a Calculator class.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 127
diff changeset
310 i += 1
bd949c554dd2 Major refactor: moved calculator routines into a Calculator class.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 127
diff changeset
311
130
c82cef747008 - reverted previous commit (now that was a bad idea)
Teemu Piippo <crimsondusk64@gmail.com>
parents: 129
diff changeset
312 if i < len(expr) and expr[i] == '.':
128
bd949c554dd2 Major refactor: moved calculator routines into a Calculator class.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 127
diff changeset
313 raise ValueError ('non-decimal floating point numbers are not supported')
bd949c554dd2 Major refactor: moved calculator routines into a Calculator class.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 127
diff changeset
314
bd949c554dd2 Major refactor: moved calculator routines into a Calculator class.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 127
diff changeset
315 if i == startingIndex:
130
c82cef747008 - reverted previous commit (now that was a bad idea)
Teemu Piippo <crimsondusk64@gmail.com>
parents: 129
diff changeset
316 if i < len (expr):
c82cef747008 - reverted previous commit (now that was a bad idea)
Teemu Piippo <crimsondusk64@gmail.com>
parents: 129
diff changeset
317 raise ValueError ('not a valid %s "%s" in %s' % (digitname, expr[i], expr[0:i+1]))
128
bd949c554dd2 Major refactor: moved calculator routines into a Calculator class.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 127
diff changeset
318 else:
bd949c554dd2 Major refactor: moved calculator routines into a Calculator class.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 127
diff changeset
319 raise ValueError ('end of expression encountered while parsing '
bd949c554dd2 Major refactor: moved calculator routines into a Calculator class.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 127
diff changeset
320 'base-%d literal' % base)
bd949c554dd2 Major refactor: moved calculator routines into a Calculator class.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 127
diff changeset
321
130
c82cef747008 - reverted previous commit (now that was a bad idea)
Teemu Piippo <crimsondusk64@gmail.com>
parents: 129
diff changeset
322 return (complex (int (expr[startingIndex:i], base), 0), i)
128
bd949c554dd2 Major refactor: moved calculator routines into a Calculator class.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 127
diff changeset
323
130
c82cef747008 - reverted previous commit (now that was a bad idea)
Teemu Piippo <crimsondusk64@gmail.com>
parents: 129
diff changeset
324 if expr[0] == 'i':
128
bd949c554dd2 Major refactor: moved calculator routines into a Calculator class.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 127
diff changeset
325 # Special case, we just have 'i' -- need special handling here because otherwise this would
bd949c554dd2 Major refactor: moved calculator routines into a Calculator class.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 127
diff changeset
326 # call float('') in the complex number routine, which throws an error.
bd949c554dd2 Major refactor: moved calculator routines into a Calculator class.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 127
diff changeset
327 # TODO: maybe 'i' can be a symbol instead?
130
c82cef747008 - reverted previous commit (now that was a bad idea)
Teemu Piippo <crimsondusk64@gmail.com>
parents: 129
diff changeset
328 return (1j, 1)
128
bd949c554dd2 Major refactor: moved calculator routines into a Calculator class.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 127
diff changeset
329
bd949c554dd2 Major refactor: moved calculator routines into a Calculator class.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 127
diff changeset
330 # Try parse increasingly long substrings until we are unable to create a float or complex number
bd949c554dd2 Major refactor: moved calculator routines into a Calculator class.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 127
diff changeset
331 # from it.
bd949c554dd2 Major refactor: moved calculator routines into a Calculator class.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 127
diff changeset
332 try:
130
c82cef747008 - reverted previous commit (now that was a bad idea)
Teemu Piippo <crimsondusk64@gmail.com>
parents: 129
diff changeset
333 while i < len (expr):
c82cef747008 - reverted previous commit (now that was a bad idea)
Teemu Piippo <crimsondusk64@gmail.com>
parents: 129
diff changeset
334 if expr[i] == 'i':
c82cef747008 - reverted previous commit (now that was a bad idea)
Teemu Piippo <crimsondusk64@gmail.com>
parents: 129
diff changeset
335 value = complex (0.0, float (expr[:i]))
128
bd949c554dd2 Major refactor: moved calculator routines into a Calculator class.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 127
diff changeset
336 else:
130
c82cef747008 - reverted previous commit (now that was a bad idea)
Teemu Piippo <crimsondusk64@gmail.com>
parents: 129
diff changeset
337 value = complex (float (expr [:i + 1]), 0.0)
128
bd949c554dd2 Major refactor: moved calculator routines into a Calculator class.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 127
diff changeset
338 i += 1
123
aeb0d0788869 - added commits.db and mercurial support restructure
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
339
130
c82cef747008 - reverted previous commit (now that was a bad idea)
Teemu Piippo <crimsondusk64@gmail.com>
parents: 129
diff changeset
340 return (value, i)
128
bd949c554dd2 Major refactor: moved calculator routines into a Calculator class.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 127
diff changeset
341 except ValueError:
bd949c554dd2 Major refactor: moved calculator routines into a Calculator class.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 127
diff changeset
342 if i != 0:
bd949c554dd2 Major refactor: moved calculator routines into a Calculator class.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 127
diff changeset
343 # Got a number (the error happened when we tried to parse past the number)
130
c82cef747008 - reverted previous commit (now that was a bad idea)
Teemu Piippo <crimsondusk64@gmail.com>
parents: 129
diff changeset
344 return (value, i)
128
bd949c554dd2 Major refactor: moved calculator routines into a Calculator class.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 127
diff changeset
345 else:
bd949c554dd2 Major refactor: moved calculator routines into a Calculator class.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 127
diff changeset
346 # The error happened on the first character. So this is not a number.
bd949c554dd2 Major refactor: moved calculator routines into a Calculator class.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 127
diff changeset
347 return None
bd949c554dd2 Major refactor: moved calculator routines into a Calculator class.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 127
diff changeset
348
130
c82cef747008 - reverted previous commit (now that was a bad idea)
Teemu Piippo <crimsondusk64@gmail.com>
parents: 129
diff changeset
349 def parse_symbol (self, expr):
128
bd949c554dd2 Major refactor: moved calculator routines into a Calculator class.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 127
diff changeset
350 for sym in Symbols:
130
c82cef747008 - reverted previous commit (now that was a bad idea)
Teemu Piippo <crimsondusk64@gmail.com>
parents: 129
diff changeset
351 if expr[:len (sym)] == sym:
128
bd949c554dd2 Major refactor: moved calculator routines into a Calculator class.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 127
diff changeset
352 return sym
bd949c554dd2 Major refactor: moved calculator routines into a Calculator class.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 127
diff changeset
353
bd949c554dd2 Major refactor: moved calculator routines into a Calculator class.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 127
diff changeset
354 return None
bd949c554dd2 Major refactor: moved calculator routines into a Calculator class.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 127
diff changeset
355
130
c82cef747008 - reverted previous commit (now that was a bad idea)
Teemu Piippo <crimsondusk64@gmail.com>
parents: 129
diff changeset
356 def tokenize (self, expr):
c82cef747008 - reverted previous commit (now that was a bad idea)
Teemu Piippo <crimsondusk64@gmail.com>
parents: 129
diff changeset
357 i=0
c82cef747008 - reverted previous commit (now that was a bad idea)
Teemu Piippo <crimsondusk64@gmail.com>
parents: 129
diff changeset
358 tokens = []
123
aeb0d0788869 - added commits.db and mercurial support restructure
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
359
130
c82cef747008 - reverted previous commit (now that was a bad idea)
Teemu Piippo <crimsondusk64@gmail.com>
parents: 129
diff changeset
360 while i < len(expr):
c82cef747008 - reverted previous commit (now that was a bad idea)
Teemu Piippo <crimsondusk64@gmail.com>
parents: 129
diff changeset
361 sym = self.parse_symbol (expr[i:])
128
bd949c554dd2 Major refactor: moved calculator routines into a Calculator class.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 127
diff changeset
362
bd949c554dd2 Major refactor: moved calculator routines into a Calculator class.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 127
diff changeset
363 if sym:
bd949c554dd2 Major refactor: moved calculator routines into a Calculator class.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 127
diff changeset
364 symtype = SymbolTypes[sym]
bd949c554dd2 Major refactor: moved calculator routines into a Calculator class.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 127
diff changeset
365 if symtype == SymbolType.CONSTANT:
130
c82cef747008 - reverted previous commit (now that was a bad idea)
Teemu Piippo <crimsondusk64@gmail.com>
parents: 129
diff changeset
366 tokens.append (Constants[sym])
128
bd949c554dd2 Major refactor: moved calculator routines into a Calculator class.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 127
diff changeset
367 else:
130
c82cef747008 - reverted previous commit (now that was a bad idea)
Teemu Piippo <crimsondusk64@gmail.com>
parents: 129
diff changeset
368 tokens.append (sym)
c82cef747008 - reverted previous commit (now that was a bad idea)
Teemu Piippo <crimsondusk64@gmail.com>
parents: 129
diff changeset
369
c82cef747008 - reverted previous commit (now that was a bad idea)
Teemu Piippo <crimsondusk64@gmail.com>
parents: 129
diff changeset
370 i += len(sym)
128
bd949c554dd2 Major refactor: moved calculator routines into a Calculator class.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 127
diff changeset
371 continue
bd949c554dd2 Major refactor: moved calculator routines into a Calculator class.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 127
diff changeset
372
130
c82cef747008 - reverted previous commit (now that was a bad idea)
Teemu Piippo <crimsondusk64@gmail.com>
parents: 129
diff changeset
373 result = self.parse_number (expr[i:])
128
bd949c554dd2 Major refactor: moved calculator routines into a Calculator class.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 127
diff changeset
374 if result:
130
c82cef747008 - reverted previous commit (now that was a bad idea)
Teemu Piippo <crimsondusk64@gmail.com>
parents: 129
diff changeset
375 num, length = result
c82cef747008 - reverted previous commit (now that was a bad idea)
Teemu Piippo <crimsondusk64@gmail.com>
parents: 129
diff changeset
376 tokens.append (num)
c82cef747008 - reverted previous commit (now that was a bad idea)
Teemu Piippo <crimsondusk64@gmail.com>
parents: 129
diff changeset
377 i += length
128
bd949c554dd2 Major refactor: moved calculator routines into a Calculator class.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 127
diff changeset
378 continue
bd949c554dd2 Major refactor: moved calculator routines into a Calculator class.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 127
diff changeset
379
130
c82cef747008 - reverted previous commit (now that was a bad idea)
Teemu Piippo <crimsondusk64@gmail.com>
parents: 129
diff changeset
380 raise ValueError ("""bad expression, couldn't parse: %s""" % expr[i:])
123
aeb0d0788869 - added commits.db and mercurial support restructure
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
381
130
c82cef747008 - reverted previous commit (now that was a bad idea)
Teemu Piippo <crimsondusk64@gmail.com>
parents: 129
diff changeset
382 return tokens
c82cef747008 - reverted previous commit (now that was a bad idea)
Teemu Piippo <crimsondusk64@gmail.com>
parents: 129
diff changeset
383
c82cef747008 - reverted previous commit (now that was a bad idea)
Teemu Piippo <crimsondusk64@gmail.com>
parents: 129
diff changeset
384 def process_parens (self, expr):
c82cef747008 - reverted previous commit (now that was a bad idea)
Teemu Piippo <crimsondusk64@gmail.com>
parents: 129
diff changeset
385 """Processes parentheses of expr into sublists in-place.
128
bd949c554dd2 Major refactor: moved calculator routines into a Calculator class.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 127
diff changeset
386 [1.0, '*', '(', 3.5, '+', 1j, ')']
bd949c554dd2 Major refactor: moved calculator routines into a Calculator class.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 127
diff changeset
387 -> [1.0, '*', [3.5, '+', 1j]]"""
130
c82cef747008 - reverted previous commit (now that was a bad idea)
Teemu Piippo <crimsondusk64@gmail.com>
parents: 129
diff changeset
388 if '(' not in expr and ')' not in expr:
128
bd949c554dd2 Major refactor: moved calculator routines into a Calculator class.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 127
diff changeset
389 return
bd949c554dd2 Major refactor: moved calculator routines into a Calculator class.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 127
diff changeset
390
bd949c554dd2 Major refactor: moved calculator routines into a Calculator class.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 127
diff changeset
391 try:
130
c82cef747008 - reverted previous commit (now that was a bad idea)
Teemu Piippo <crimsondusk64@gmail.com>
parents: 129
diff changeset
392 parenStart = rindex (expr, '(')
c82cef747008 - reverted previous commit (now that was a bad idea)
Teemu Piippo <crimsondusk64@gmail.com>
parents: 129
diff changeset
393 parenEnd = expr.index (')', parenStart)
128
bd949c554dd2 Major refactor: moved calculator routines into a Calculator class.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 127
diff changeset
394 except ValueError:
130
c82cef747008 - reverted previous commit (now that was a bad idea)
Teemu Piippo <crimsondusk64@gmail.com>
parents: 129
diff changeset
395 raise ValueError ("""mismatched parentheses in expression: %s""" % expr)
123
aeb0d0788869 - added commits.db and mercurial support restructure
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
396
130
c82cef747008 - reverted previous commit (now that was a bad idea)
Teemu Piippo <crimsondusk64@gmail.com>
parents: 129
diff changeset
397 subexpr = expr[parenStart + 1:parenEnd]
c82cef747008 - reverted previous commit (now that was a bad idea)
Teemu Piippo <crimsondusk64@gmail.com>
parents: 129
diff changeset
398 del expr[parenStart + 1:parenEnd + 1]
c82cef747008 - reverted previous commit (now that was a bad idea)
Teemu Piippo <crimsondusk64@gmail.com>
parents: 129
diff changeset
399 expr[parenStart] = subexpr
c82cef747008 - reverted previous commit (now that was a bad idea)
Teemu Piippo <crimsondusk64@gmail.com>
parents: 129
diff changeset
400 self.process_parens (expr)
128
bd949c554dd2 Major refactor: moved calculator routines into a Calculator class.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 127
diff changeset
401
130
c82cef747008 - reverted previous commit (now that was a bad idea)
Teemu Piippo <crimsondusk64@gmail.com>
parents: 129
diff changeset
402 def process_functions (self, expr):
128
bd949c554dd2 Major refactor: moved calculator routines into a Calculator class.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 127
diff changeset
403 """Processes functions in-place"""
bd949c554dd2 Major refactor: moved calculator routines into a Calculator class.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 127
diff changeset
404 i = 0
130
c82cef747008 - reverted previous commit (now that was a bad idea)
Teemu Piippo <crimsondusk64@gmail.com>
parents: 129
diff changeset
405 while i < len (expr):
c82cef747008 - reverted previous commit (now that was a bad idea)
Teemu Piippo <crimsondusk64@gmail.com>
parents: 129
diff changeset
406 if type (expr[i]) is list:
c82cef747008 - reverted previous commit (now that was a bad idea)
Teemu Piippo <crimsondusk64@gmail.com>
parents: 129
diff changeset
407 self.process_functions (expr[i])
128
bd949c554dd2 Major refactor: moved calculator routines into a Calculator class.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 127
diff changeset
408
130
c82cef747008 - reverted previous commit (now that was a bad idea)
Teemu Piippo <crimsondusk64@gmail.com>
parents: 129
diff changeset
409 if (type(expr[i]) is not str) or (expr[i] not in Functions):
128
bd949c554dd2 Major refactor: moved calculator routines into a Calculator class.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 127
diff changeset
410 i += 1
bd949c554dd2 Major refactor: moved calculator routines into a Calculator class.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 127
diff changeset
411 continue
bd949c554dd2 Major refactor: moved calculator routines into a Calculator class.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 127
diff changeset
412
bd949c554dd2 Major refactor: moved calculator routines into a Calculator class.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 127
diff changeset
413 # Ensure that arguments follow
130
c82cef747008 - reverted previous commit (now that was a bad idea)
Teemu Piippo <crimsondusk64@gmail.com>
parents: 129
diff changeset
414 if (i + 1 >= len (expr)) or (type (expr[i + 1]) is not list):
c82cef747008 - reverted previous commit (now that was a bad idea)
Teemu Piippo <crimsondusk64@gmail.com>
parents: 129
diff changeset
415 raise ValueError ("""function %s used without arguments""" % expr[i])
123
aeb0d0788869 - added commits.db and mercurial support restructure
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
416
130
c82cef747008 - reverted previous commit (now that was a bad idea)
Teemu Piippo <crimsondusk64@gmail.com>
parents: 129
diff changeset
417 args = expr[i + 1]
c82cef747008 - reverted previous commit (now that was a bad idea)
Teemu Piippo <crimsondusk64@gmail.com>
parents: 129
diff changeset
418 del expr[i + 1]
c82cef747008 - reverted previous commit (now that was a bad idea)
Teemu Piippo <crimsondusk64@gmail.com>
parents: 129
diff changeset
419 expr[i] = FunctionCall (expr[i], args)
128
bd949c554dd2 Major refactor: moved calculator routines into a Calculator class.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 127
diff changeset
420 i += 1
bd949c554dd2 Major refactor: moved calculator routines into a Calculator class.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 127
diff changeset
421
bd949c554dd2 Major refactor: moved calculator routines into a Calculator class.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 127
diff changeset
422 def is_operand (self, x):
bd949c554dd2 Major refactor: moved calculator routines into a Calculator class.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 127
diff changeset
423 # Operands can be either lists (which also mean parens, thus can be single-expressions)
bd949c554dd2 Major refactor: moved calculator routines into a Calculator class.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 127
diff changeset
424 # or complex numbers
132
a22c50f52a23 lots of new stuff
Teemu Piippo <crimsondusk64@gmail.com>
parents: 131
diff changeset
425 return type(x) in [complex, list, FunctionCall]
128
bd949c554dd2 Major refactor: moved calculator routines into a Calculator class.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 127
diff changeset
426
bd949c554dd2 Major refactor: moved calculator routines into a Calculator class.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 127
diff changeset
427 def find_fitting_operator (self, sym, numOperands):
bd949c554dd2 Major refactor: moved calculator routines into a Calculator class.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 127
diff changeset
428 # Pass 1: exact numOperands match
bd949c554dd2 Major refactor: moved calculator routines into a Calculator class.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 127
diff changeset
429 for op in Operators:
bd949c554dd2 Major refactor: moved calculator routines into a Calculator class.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 127
diff changeset
430 if op.symbol != sym:
bd949c554dd2 Major refactor: moved calculator routines into a Calculator class.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 127
diff changeset
431 continue
123
aeb0d0788869 - added commits.db and mercurial support restructure
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
432
128
bd949c554dd2 Major refactor: moved calculator routines into a Calculator class.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 127
diff changeset
433 if op.operands == numOperands:
bd949c554dd2 Major refactor: moved calculator routines into a Calculator class.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 127
diff changeset
434 return op
bd949c554dd2 Major refactor: moved calculator routines into a Calculator class.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 127
diff changeset
435
bd949c554dd2 Major refactor: moved calculator routines into a Calculator class.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 127
diff changeset
436 # Pass 2: by symbol
bd949c554dd2 Major refactor: moved calculator routines into a Calculator class.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 127
diff changeset
437 for op in Operators:
bd949c554dd2 Major refactor: moved calculator routines into a Calculator class.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 127
diff changeset
438 if op.symbol == sym:
bd949c554dd2 Major refactor: moved calculator routines into a Calculator class.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 127
diff changeset
439 return op
bd949c554dd2 Major refactor: moved calculator routines into a Calculator class.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 127
diff changeset
440
bd949c554dd2 Major refactor: moved calculator routines into a Calculator class.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 127
diff changeset
441 raise ValueError ('''unknown operator %s!''' % sym)
bd949c554dd2 Major refactor: moved calculator routines into a Calculator class.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 127
diff changeset
442
130
c82cef747008 - reverted previous commit (now that was a bad idea)
Teemu Piippo <crimsondusk64@gmail.com>
parents: 129
diff changeset
443 def process_operators (self, expr):
128
bd949c554dd2 Major refactor: moved calculator routines into a Calculator class.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 127
diff changeset
444 """Processes operators"""
bd949c554dd2 Major refactor: moved calculator routines into a Calculator class.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 127
diff changeset
445 i = 0
bd949c554dd2 Major refactor: moved calculator routines into a Calculator class.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 127
diff changeset
446
bd949c554dd2 Major refactor: moved calculator routines into a Calculator class.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 127
diff changeset
447 # Find all operators in this expression
130
c82cef747008 - reverted previous commit (now that was a bad idea)
Teemu Piippo <crimsondusk64@gmail.com>
parents: 129
diff changeset
448 while i < len (expr):
c82cef747008 - reverted previous commit (now that was a bad idea)
Teemu Piippo <crimsondusk64@gmail.com>
parents: 129
diff changeset
449 if type (expr[i]) is list:
c82cef747008 - reverted previous commit (now that was a bad idea)
Teemu Piippo <crimsondusk64@gmail.com>
parents: 129
diff changeset
450 self.process_functions (expr[i])
c82cef747008 - reverted previous commit (now that was a bad idea)
Teemu Piippo <crimsondusk64@gmail.com>
parents: 129
diff changeset
451 self.process_operators (expr[i])
123
aeb0d0788869 - added commits.db and mercurial support restructure
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
452
130
c82cef747008 - reverted previous commit (now that was a bad idea)
Teemu Piippo <crimsondusk64@gmail.com>
parents: 129
diff changeset
453 if type (expr[i]) is FunctionCall:
c82cef747008 - reverted previous commit (now that was a bad idea)
Teemu Piippo <crimsondusk64@gmail.com>
parents: 129
diff changeset
454 self.process_functions (expr[i].args)
c82cef747008 - reverted previous commit (now that was a bad idea)
Teemu Piippo <crimsondusk64@gmail.com>
parents: 129
diff changeset
455 self.process_operators (expr[i].args)
128
bd949c554dd2 Major refactor: moved calculator routines into a Calculator class.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 127
diff changeset
456
130
c82cef747008 - reverted previous commit (now that was a bad idea)
Teemu Piippo <crimsondusk64@gmail.com>
parents: 129
diff changeset
457 if (type(expr[i]) is not str) or (expr[i] not in OperatorSymbols):
128
bd949c554dd2 Major refactor: moved calculator routines into a Calculator class.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 127
diff changeset
458 i += 1
bd949c554dd2 Major refactor: moved calculator routines into a Calculator class.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 127
diff changeset
459 continue
bd949c554dd2 Major refactor: moved calculator routines into a Calculator class.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 127
diff changeset
460
bd949c554dd2 Major refactor: moved calculator routines into a Calculator class.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 127
diff changeset
461 args = []
bd949c554dd2 Major refactor: moved calculator routines into a Calculator class.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 127
diff changeset
462 argIndices = []
130
c82cef747008 - reverted previous commit (now that was a bad idea)
Teemu Piippo <crimsondusk64@gmail.com>
parents: 129
diff changeset
463 if i > 0 and self.is_operand (expr[i - 1]):
c82cef747008 - reverted previous commit (now that was a bad idea)
Teemu Piippo <crimsondusk64@gmail.com>
parents: 129
diff changeset
464 args.append (expr[i - 1])
128
bd949c554dd2 Major refactor: moved calculator routines into a Calculator class.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 127
diff changeset
465 argIndices.append (i - 1)
bd949c554dd2 Major refactor: moved calculator routines into a Calculator class.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 127
diff changeset
466
130
c82cef747008 - reverted previous commit (now that was a bad idea)
Teemu Piippo <crimsondusk64@gmail.com>
parents: 129
diff changeset
467 if i - 1 < len(expr) and self.is_operand (expr[i + 1]):
c82cef747008 - reverted previous commit (now that was a bad idea)
Teemu Piippo <crimsondusk64@gmail.com>
parents: 129
diff changeset
468 args.append (expr[i + 1])
128
bd949c554dd2 Major refactor: moved calculator routines into a Calculator class.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 127
diff changeset
469 argIndices.append (i + 1)
123
aeb0d0788869 - added commits.db and mercurial support restructure
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
470
128
bd949c554dd2 Major refactor: moved calculator routines into a Calculator class.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 127
diff changeset
471 # Resolve operators with the same symbol based on operand count
bd949c554dd2 Major refactor: moved calculator routines into a Calculator class.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 127
diff changeset
472 numOperands = 0
bd949c554dd2 Major refactor: moved calculator routines into a Calculator class.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 127
diff changeset
473 for arg in args:
bd949c554dd2 Major refactor: moved calculator routines into a Calculator class.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 127
diff changeset
474 if self.is_operand (arg):
bd949c554dd2 Major refactor: moved calculator routines into a Calculator class.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 127
diff changeset
475 numOperands += 1
bd949c554dd2 Major refactor: moved calculator routines into a Calculator class.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 127
diff changeset
476
130
c82cef747008 - reverted previous commit (now that was a bad idea)
Teemu Piippo <crimsondusk64@gmail.com>
parents: 129
diff changeset
477 expr[i] = self.find_fitting_operator (expr[i], numOperands)
128
bd949c554dd2 Major refactor: moved calculator routines into a Calculator class.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 127
diff changeset
478 i += 1
123
aeb0d0788869 - added commits.db and mercurial support restructure
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
479
130
c82cef747008 - reverted previous commit (now that was a bad idea)
Teemu Piippo <crimsondusk64@gmail.com>
parents: 129
diff changeset
480 def find_priority_operator (self, expr):
128
bd949c554dd2 Major refactor: moved calculator routines into a Calculator class.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 127
diff changeset
481 """Finds the operator with most priority in the expression"""
bd949c554dd2 Major refactor: moved calculator routines into a Calculator class.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 127
diff changeset
482 bestOp = None
bd949c554dd2 Major refactor: moved calculator routines into a Calculator class.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 127
diff changeset
483 bestOpIndex = -1
bd949c554dd2 Major refactor: moved calculator routines into a Calculator class.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 127
diff changeset
484
130
c82cef747008 - reverted previous commit (now that was a bad idea)
Teemu Piippo <crimsondusk64@gmail.com>
parents: 129
diff changeset
485 for i in range (0, len (expr)):
c82cef747008 - reverted previous commit (now that was a bad idea)
Teemu Piippo <crimsondusk64@gmail.com>
parents: 129
diff changeset
486 sym = expr[i]
128
bd949c554dd2 Major refactor: moved calculator routines into a Calculator class.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 127
diff changeset
487
bd949c554dd2 Major refactor: moved calculator routines into a Calculator class.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 127
diff changeset
488 if type (sym) is not Operator:
bd949c554dd2 Major refactor: moved calculator routines into a Calculator class.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 127
diff changeset
489 continue
123
aeb0d0788869 - added commits.db and mercurial support restructure
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
490
128
bd949c554dd2 Major refactor: moved calculator routines into a Calculator class.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 127
diff changeset
491 if not bestOp or sym.priority < bestOp.priority:
bd949c554dd2 Major refactor: moved calculator routines into a Calculator class.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 127
diff changeset
492 bestOp = sym
bd949c554dd2 Major refactor: moved calculator routines into a Calculator class.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 127
diff changeset
493 bestOpIndex = i
bd949c554dd2 Major refactor: moved calculator routines into a Calculator class.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 127
diff changeset
494
bd949c554dd2 Major refactor: moved calculator routines into a Calculator class.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 127
diff changeset
495 return (bestOp, bestOpIndex)
bd949c554dd2 Major refactor: moved calculator routines into a Calculator class.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 127
diff changeset
496
130
c82cef747008 - reverted previous commit (now that was a bad idea)
Teemu Piippo <crimsondusk64@gmail.com>
parents: 129
diff changeset
497 def evaluate (self, expr, verbose=False):
128
bd949c554dd2 Major refactor: moved calculator routines into a Calculator class.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 127
diff changeset
498 printFunc = realPrint if verbose else lambda x:None
130
c82cef747008 - reverted previous commit (now that was a bad idea)
Teemu Piippo <crimsondusk64@gmail.com>
parents: 129
diff changeset
499 printFunc (self.tabs + 'Preprocess: %s' % expr)
128
bd949c554dd2 Major refactor: moved calculator routines into a Calculator class.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 127
diff changeset
500
bd949c554dd2 Major refactor: moved calculator routines into a Calculator class.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 127
diff changeset
501 # If there are sub-expressions in here, those need to be evaluated first
bd949c554dd2 Major refactor: moved calculator routines into a Calculator class.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 127
diff changeset
502 i = 0
130
c82cef747008 - reverted previous commit (now that was a bad idea)
Teemu Piippo <crimsondusk64@gmail.com>
parents: 129
diff changeset
503 while i < len (expr):
c82cef747008 - reverted previous commit (now that was a bad idea)
Teemu Piippo <crimsondusk64@gmail.com>
parents: 129
diff changeset
504 sym = expr[i]
126
0fc519afba89 - added binary support for calc
Teemu Piippo <crimsondusk64@gmail.com>
parents: 125
diff changeset
505
128
bd949c554dd2 Major refactor: moved calculator routines into a Calculator class.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 127
diff changeset
506 if type (sym) is list and sym:
bd949c554dd2 Major refactor: moved calculator routines into a Calculator class.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 127
diff changeset
507 printFunc (self.tabs + 'Evaluating sub-expression: %s' % (sym))
bd949c554dd2 Major refactor: moved calculator routines into a Calculator class.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 127
diff changeset
508 self.tabs += '\t'
130
c82cef747008 - reverted previous commit (now that was a bad idea)
Teemu Piippo <crimsondusk64@gmail.com>
parents: 129
diff changeset
509 expr[i] = self.evaluate (list (sym), verbose)
128
bd949c554dd2 Major refactor: moved calculator routines into a Calculator class.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 127
diff changeset
510 self.tabs = self.tabs[:-1]
130
c82cef747008 - reverted previous commit (now that was a bad idea)
Teemu Piippo <crimsondusk64@gmail.com>
parents: 129
diff changeset
511 printFunc (self.tabs + '-> %s' % expr[i])
128
bd949c554dd2 Major refactor: moved calculator routines into a Calculator class.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 127
diff changeset
512
bd949c554dd2 Major refactor: moved calculator routines into a Calculator class.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 127
diff changeset
513 # If there are function calls, evaluate those
bd949c554dd2 Major refactor: moved calculator routines into a Calculator class.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 127
diff changeset
514 if type (sym) is FunctionCall:
bd949c554dd2 Major refactor: moved calculator routines into a Calculator class.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 127
diff changeset
515 self.tabs += '\t'
bd949c554dd2 Major refactor: moved calculator routines into a Calculator class.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 127
diff changeset
516 if sym.args:
bd949c554dd2 Major refactor: moved calculator routines into a Calculator class.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 127
diff changeset
517 sym.args = [self.evaluate (sym.args, verbose)]
bd949c554dd2 Major refactor: moved calculator routines into a Calculator class.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 127
diff changeset
518 self.tabs = self.tabs[:-1]
bd949c554dd2 Major refactor: moved calculator routines into a Calculator class.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 127
diff changeset
519
bd949c554dd2 Major refactor: moved calculator routines into a Calculator class.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 127
diff changeset
520 printFunc (self.tabs + 'Evaluating function call: %s' % (sym))
130
c82cef747008 - reverted previous commit (now that was a bad idea)
Teemu Piippo <crimsondusk64@gmail.com>
parents: 129
diff changeset
521 expr[i] = Functions[sym.funcname]['function'] (*sym.args)
c82cef747008 - reverted previous commit (now that was a bad idea)
Teemu Piippo <crimsondusk64@gmail.com>
parents: 129
diff changeset
522 printFunc (self.tabs + '-> %s' % expr[i])
128
bd949c554dd2 Major refactor: moved calculator routines into a Calculator class.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 127
diff changeset
523
bd949c554dd2 Major refactor: moved calculator routines into a Calculator class.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 127
diff changeset
524 i += 1
bd949c554dd2 Major refactor: moved calculator routines into a Calculator class.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 127
diff changeset
525
130
c82cef747008 - reverted previous commit (now that was a bad idea)
Teemu Piippo <crimsondusk64@gmail.com>
parents: 129
diff changeset
526 printFunc (self.tabs + 'Evaluate: %s' % expr)
126
0fc519afba89 - added binary support for calc
Teemu Piippo <crimsondusk64@gmail.com>
parents: 125
diff changeset
527 runaway = 0
128
bd949c554dd2 Major refactor: moved calculator routines into a Calculator class.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 127
diff changeset
528 while True:
126
0fc519afba89 - added binary support for calc
Teemu Piippo <crimsondusk64@gmail.com>
parents: 125
diff changeset
529 runaway += 1
127
66b206bd9510 Cranked up the runaway (8 was only for testing)
Teemu Piippo <crimsondusk64@gmail.com>
parents: 126
diff changeset
530 if runaway > 1000:
128
bd949c554dd2 Major refactor: moved calculator routines into a Calculator class.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 127
diff changeset
531 raise ValueError ('infinite loop detected')
bd949c554dd2 Major refactor: moved calculator routines into a Calculator class.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 127
diff changeset
532
130
c82cef747008 - reverted previous commit (now that was a bad idea)
Teemu Piippo <crimsondusk64@gmail.com>
parents: 129
diff changeset
533 op, i = self.find_priority_operator (expr)
128
bd949c554dd2 Major refactor: moved calculator routines into a Calculator class.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 127
diff changeset
534 if not op:
bd949c554dd2 Major refactor: moved calculator routines into a Calculator class.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 127
diff changeset
535 break
bd949c554dd2 Major refactor: moved calculator routines into a Calculator class.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 127
diff changeset
536
bd949c554dd2 Major refactor: moved calculator routines into a Calculator class.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 127
diff changeset
537 if op.operands == 2:
bd949c554dd2 Major refactor: moved calculator routines into a Calculator class.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 127
diff changeset
538 argIndices = [i - 1, i + 1]
bd949c554dd2 Major refactor: moved calculator routines into a Calculator class.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 127
diff changeset
539 else:
bd949c554dd2 Major refactor: moved calculator routines into a Calculator class.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 127
diff changeset
540 argIndices = [i + 1]
126
0fc519afba89 - added binary support for calc
Teemu Piippo <crimsondusk64@gmail.com>
parents: 125
diff changeset
541
130
c82cef747008 - reverted previous commit (now that was a bad idea)
Teemu Piippo <crimsondusk64@gmail.com>
parents: 129
diff changeset
542 args = [expr[x] for x in argIndices]
128
bd949c554dd2 Major refactor: moved calculator routines into a Calculator class.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 127
diff changeset
543 argIndices = sorted (argIndices, reverse=True)
bd949c554dd2 Major refactor: moved calculator routines into a Calculator class.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 127
diff changeset
544 printFunc (self.tabs + 'Processing: (%s, %d) with args %s' % (op, i, args))
130
c82cef747008 - reverted previous commit (now that was a bad idea)
Teemu Piippo <crimsondusk64@gmail.com>
parents: 129
diff changeset
545 expr[i] = op.function (*args)
c82cef747008 - reverted previous commit (now that was a bad idea)
Teemu Piippo <crimsondusk64@gmail.com>
parents: 129
diff changeset
546 printFunc (self.tabs + '-> %s' % expr[i])
126
0fc519afba89 - added binary support for calc
Teemu Piippo <crimsondusk64@gmail.com>
parents: 125
diff changeset
547
128
bd949c554dd2 Major refactor: moved calculator routines into a Calculator class.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 127
diff changeset
548 for i2 in argIndices:
130
c82cef747008 - reverted previous commit (now that was a bad idea)
Teemu Piippo <crimsondusk64@gmail.com>
parents: 129
diff changeset
549 del expr[i2]
126
0fc519afba89 - added binary support for calc
Teemu Piippo <crimsondusk64@gmail.com>
parents: 125
diff changeset
550
130
c82cef747008 - reverted previous commit (now that was a bad idea)
Teemu Piippo <crimsondusk64@gmail.com>
parents: 129
diff changeset
551 printFunc (self.tabs + 'Result: %s' % expr[0])
123
aeb0d0788869 - added commits.db and mercurial support restructure
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
552
130
c82cef747008 - reverted previous commit (now that was a bad idea)
Teemu Piippo <crimsondusk64@gmail.com>
parents: 129
diff changeset
553 if len(expr) != 1:
c82cef747008 - reverted previous commit (now that was a bad idea)
Teemu Piippo <crimsondusk64@gmail.com>
parents: 129
diff changeset
554 printFunc (self.tabs + 'Bad expression detected, tokens: %s' % expr)
128
bd949c554dd2 Major refactor: moved calculator routines into a Calculator class.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 127
diff changeset
555 raise ValueError ('malformed expression')
bd949c554dd2 Major refactor: moved calculator routines into a Calculator class.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 127
diff changeset
556
130
c82cef747008 - reverted previous commit (now that was a bad idea)
Teemu Piippo <crimsondusk64@gmail.com>
parents: 129
diff changeset
557 return expr[0]
123
aeb0d0788869 - added commits.db and mercurial support restructure
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
558
128
bd949c554dd2 Major refactor: moved calculator routines into a Calculator class.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 127
diff changeset
559 def repr_number (self, x):
bd949c554dd2 Major refactor: moved calculator routines into a Calculator class.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 127
diff changeset
560 """Returns a string representation for a real number"""
bd949c554dd2 Major refactor: moved calculator routines into a Calculator class.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 127
diff changeset
561 base = self.preferred_base if self.preferred_base else 10
bd949c554dd2 Major refactor: moved calculator routines into a Calculator class.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 127
diff changeset
562 if math.fabs (x - math.floor(x)) < epsilon and base != 10:
bd949c554dd2 Major refactor: moved calculator routines into a Calculator class.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 127
diff changeset
563 digits='0123456789abcdef'
bd949c554dd2 Major refactor: moved calculator routines into a Calculator class.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 127
diff changeset
564 assert base <= len (digits), '''base %d is too large''' % base
123
aeb0d0788869 - added commits.db and mercurial support restructure
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
565
128
bd949c554dd2 Major refactor: moved calculator routines into a Calculator class.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 127
diff changeset
566 divisor = base
bd949c554dd2 Major refactor: moved calculator routines into a Calculator class.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 127
diff changeset
567 rep = ''
bd949c554dd2 Major refactor: moved calculator routines into a Calculator class.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 127
diff changeset
568 x = int (x)
bd949c554dd2 Major refactor: moved calculator routines into a Calculator class.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 127
diff changeset
569 runaway = 0
125
c44b1aa85257 - added hex support to the calculator
Teemu Piippo <crimsondusk64@gmail.com>
parents: 124
diff changeset
570
128
bd949c554dd2 Major refactor: moved calculator routines into a Calculator class.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 127
diff changeset
571 while x > 0:
bd949c554dd2 Major refactor: moved calculator routines into a Calculator class.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 127
diff changeset
572 runaway += 1
bd949c554dd2 Major refactor: moved calculator routines into a Calculator class.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 127
diff changeset
573 if runaway > 1000:
bd949c554dd2 Major refactor: moved calculator routines into a Calculator class.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 127
diff changeset
574 raise ValueError('runaway triggered')
123
aeb0d0788869 - added commits.db and mercurial support restructure
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
575
128
bd949c554dd2 Major refactor: moved calculator routines into a Calculator class.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 127
diff changeset
576 i = (x % divisor) / (divisor / base)
bd949c554dd2 Major refactor: moved calculator routines into a Calculator class.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 127
diff changeset
577 x -= i * (divisor / base)
bd949c554dd2 Major refactor: moved calculator routines into a Calculator class.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 127
diff changeset
578 rep += digits[i]
bd949c554dd2 Major refactor: moved calculator routines into a Calculator class.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 127
diff changeset
579 divisor *= base
123
aeb0d0788869 - added commits.db and mercurial support restructure
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
580
128
bd949c554dd2 Major refactor: moved calculator routines into a Calculator class.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 127
diff changeset
581 rep += 'x' if base == 16 else 'b'
bd949c554dd2 Major refactor: moved calculator routines into a Calculator class.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 127
diff changeset
582 rep += '0'
bd949c554dd2 Major refactor: moved calculator routines into a Calculator class.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 127
diff changeset
583 return rep[::-1]
bd949c554dd2 Major refactor: moved calculator routines into a Calculator class.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 127
diff changeset
584
bd949c554dd2 Major refactor: moved calculator routines into a Calculator class.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 127
diff changeset
585 rep = '%.10f' % x
bd949c554dd2 Major refactor: moved calculator routines into a Calculator class.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 127
diff changeset
586
bd949c554dd2 Major refactor: moved calculator routines into a Calculator class.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 127
diff changeset
587 if '.' in rep:
bd949c554dd2 Major refactor: moved calculator routines into a Calculator class.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 127
diff changeset
588 while rep[-1] == '0':
bd949c554dd2 Major refactor: moved calculator routines into a Calculator class.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 127
diff changeset
589 rep = rep[:-1]
bd949c554dd2 Major refactor: moved calculator routines into a Calculator class.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 127
diff changeset
590
bd949c554dd2 Major refactor: moved calculator routines into a Calculator class.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 127
diff changeset
591 if rep[-1] == '.':
bd949c554dd2 Major refactor: moved calculator routines into a Calculator class.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 127
diff changeset
592 rep = rep[:-1]
123
aeb0d0788869 - added commits.db and mercurial support restructure
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
593
128
bd949c554dd2 Major refactor: moved calculator routines into a Calculator class.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 127
diff changeset
594 return rep
bd949c554dd2 Major refactor: moved calculator routines into a Calculator class.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 127
diff changeset
595
bd949c554dd2 Major refactor: moved calculator routines into a Calculator class.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 127
diff changeset
596 def repr_imaginary (self, x):
bd949c554dd2 Major refactor: moved calculator routines into a Calculator class.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 127
diff changeset
597 rep = self.repr_number (x)
123
aeb0d0788869 - added commits.db and mercurial support restructure
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
598
128
bd949c554dd2 Major refactor: moved calculator routines into a Calculator class.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 127
diff changeset
599 if rep == '1':
bd949c554dd2 Major refactor: moved calculator routines into a Calculator class.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 127
diff changeset
600 return 'i'
bd949c554dd2 Major refactor: moved calculator routines into a Calculator class.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 127
diff changeset
601
bd949c554dd2 Major refactor: moved calculator routines into a Calculator class.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 127
diff changeset
602 if rep == '-1':
bd949c554dd2 Major refactor: moved calculator routines into a Calculator class.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 127
diff changeset
603 return '-i'
bd949c554dd2 Major refactor: moved calculator routines into a Calculator class.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 127
diff changeset
604
bd949c554dd2 Major refactor: moved calculator routines into a Calculator class.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 127
diff changeset
605 return rep + 'i'
123
aeb0d0788869 - added commits.db and mercurial support restructure
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
606
128
bd949c554dd2 Major refactor: moved calculator routines into a Calculator class.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 127
diff changeset
607 def represent (self, x):
bd949c554dd2 Major refactor: moved calculator routines into a Calculator class.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 127
diff changeset
608 """Returns a string representation of a float or complex number"""
bd949c554dd2 Major refactor: moved calculator routines into a Calculator class.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 127
diff changeset
609 if math.fabs (x.imag) > epsilon:
bd949c554dd2 Major refactor: moved calculator routines into a Calculator class.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 127
diff changeset
610 if math.fabs (x.real) > epsilon:
bd949c554dd2 Major refactor: moved calculator routines into a Calculator class.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 127
diff changeset
611 # Complex number
bd949c554dd2 Major refactor: moved calculator routines into a Calculator class.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 127
diff changeset
612 return '%s %s %s' % (self.repr_number (x.real),
bd949c554dd2 Major refactor: moved calculator routines into a Calculator class.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 127
diff changeset
613 '+' if x.imag >= 0 else '-',
bd949c554dd2 Major refactor: moved calculator routines into a Calculator class.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 127
diff changeset
614 self.repr_imaginary (math.fabs (x.imag)))
bd949c554dd2 Major refactor: moved calculator routines into a Calculator class.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 127
diff changeset
615 else:
bd949c554dd2 Major refactor: moved calculator routines into a Calculator class.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 127
diff changeset
616 # Pure imaginary number
bd949c554dd2 Major refactor: moved calculator routines into a Calculator class.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 127
diff changeset
617 return self.repr_imaginary (x.imag)
123
aeb0d0788869 - added commits.db and mercurial support restructure
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
618 else:
128
bd949c554dd2 Major refactor: moved calculator routines into a Calculator class.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 127
diff changeset
619 # Real number
bd949c554dd2 Major refactor: moved calculator routines into a Calculator class.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 127
diff changeset
620 return self.repr_number (x.real)
123
aeb0d0788869 - added commits.db and mercurial support restructure
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
621
128
bd949c554dd2 Major refactor: moved calculator routines into a Calculator class.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 127
diff changeset
622 def calc (self, expr, verbose=False):
bd949c554dd2 Major refactor: moved calculator routines into a Calculator class.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 127
diff changeset
623 self.state = {}
bd949c554dd2 Major refactor: moved calculator routines into a Calculator class.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 127
diff changeset
624 self.tabs = ''
130
c82cef747008 - reverted previous commit (now that was a bad idea)
Teemu Piippo <crimsondusk64@gmail.com>
parents: 129
diff changeset
625 expr = self.trim_spaces (expr)
c82cef747008 - reverted previous commit (now that was a bad idea)
Teemu Piippo <crimsondusk64@gmail.com>
parents: 129
diff changeset
626 expr = self.parse_attributes (expr)
c82cef747008 - reverted previous commit (now that was a bad idea)
Teemu Piippo <crimsondusk64@gmail.com>
parents: 129
diff changeset
627 expr = self.tokenize (expr)
c82cef747008 - reverted previous commit (now that was a bad idea)
Teemu Piippo <crimsondusk64@gmail.com>
parents: 129
diff changeset
628 self.process_parens (expr)
c82cef747008 - reverted previous commit (now that was a bad idea)
Teemu Piippo <crimsondusk64@gmail.com>
parents: 129
diff changeset
629 self.process_functions (expr)
c82cef747008 - reverted previous commit (now that was a bad idea)
Teemu Piippo <crimsondusk64@gmail.com>
parents: 129
diff changeset
630 self.process_operators (expr)
c82cef747008 - reverted previous commit (now that was a bad idea)
Teemu Piippo <crimsondusk64@gmail.com>
parents: 129
diff changeset
631 result = self.evaluate (expr, verbose)
128
bd949c554dd2 Major refactor: moved calculator routines into a Calculator class.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 127
diff changeset
632 return self.represent (result)

mercurial