Mon, 04 May 2015 02:19:21 +0300
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 = 1e10 
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  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 ('nondecimal 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 inplace. 
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 inplace""" 
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 singleexpressions) 
bd949c554dd2
Major refactor: moved calculator routines into a Calculator class.
Teemu Piippo <crimsondusk64@gmail.com>
parents:
127
diff
changeset

424  # or complex numbers 
132  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 subexpressions 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 subexpression: %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) 