calc.py

changeset 136
3812bfce21e0
parent 135
ad27ab7e6fb6
child 137
ecb5be9b604e
equal deleted inserted replaced
135:ad27ab7e6fb6 136:3812bfce21e0
70 self.funcname = funcname 70 self.funcname = funcname
71 self.args = args 71 self.args = args
72 72
73 def __str__ (self): 73 def __str__ (self):
74 return '''<function %s (%s)>''' % (self.funcname, self.args) 74 return '''<function %s (%s)>''' % (self.funcname, self.args)
75
76 def __repr__ (self):
77 return self.__str__()
78
79 class Value (object):
80 def __init__ (self, value, base):
81 self.value = value
82
83 def __str__ (self):
84 return '''<value %s>''' % (self.value)
75 85
76 def __repr__ (self): 86 def __repr__ (self):
77 return self.__str__() 87 return self.__str__()
78 88
79 def do_realf (func, *args): 89 def do_realf (func, *args):
336 raise ValueError ('not a valid %s "%s" in %s' % (digitname, expr[i], expr[0:i+1])) 346 raise ValueError ('not a valid %s "%s" in %s' % (digitname, expr[i], expr[0:i+1]))
337 else: 347 else:
338 raise ValueError ('end of expression encountered while parsing ' 348 raise ValueError ('end of expression encountered while parsing '
339 'base-%d literal' % base) 349 'base-%d literal' % base)
340 350
341 return (complex (int (expr[startingIndex:i], base), 0), i) 351 return (Value (int (expr[startingIndex:i], base)), i)
342 352
343 if expr[0] == 'i': 353 if expr[0] == 'i':
344 # Special case, we just have 'i' -- need special handling here because otherwise this would 354 # Special case, we just have 'i' -- need special handling here because otherwise this would
345 # call float('') in the complex number routine, which throws an error. 355 # call float('') in the complex number routine, which throws an error.
346 # TODO: maybe 'i' can be a symbol instead? 356 # TODO: maybe 'i' can be a symbol instead?
349 # Try parse increasingly long substrings until we are unable to create a float or complex number 359 # Try parse increasingly long substrings until we are unable to create a float or complex number
350 # from it. 360 # from it.
351 try: 361 try:
352 while i < len (expr): 362 while i < len (expr):
353 if expr[i] == 'i': 363 if expr[i] == 'i':
354 value = complex (0.0, float (expr[:i])) 364 value = Value (float (expr[:i]) * 1j)
355 else: 365 else:
356 value = complex (float (expr [:i + 1]), 0.0) 366 value = Value (float (expr [:i + 1]))
357 i += 1 367 i += 1
358 368
359 return (value, i) 369 return (value, i)
360 except ValueError: 370 except ValueError:
361 if i != 0: 371 if i != 0:
535 if sym.args: 545 if sym.args:
536 sym.args = [self.evaluate (sym.args, verbose)] 546 sym.args = [self.evaluate (sym.args, verbose)]
537 self.tabs = self.tabs[:-1] 547 self.tabs = self.tabs[:-1]
538 548
539 printFunc (self.tabs + 'Evaluating function call: %s' % (sym)) 549 printFunc (self.tabs + 'Evaluating function call: %s' % (sym))
540 expr[i] = Functions[sym.funcname]['function'] (*sym.args) 550 expr[i] = Value (Functions[sym.funcname]['function'] (*[x.value for x in sym.args]))
541 printFunc (self.tabs + '-> %s' % expr[i]) 551 printFunc (self.tabs + '-> %s' % expr[i])
542 552
543 i += 1 553 i += 1
544 554
545 printFunc (self.tabs + 'Evaluate: %s' % expr) 555 printFunc (self.tabs + 'Evaluate: %s' % expr)
559 argIndices = [i + 1] 569 argIndices = [i + 1]
560 570
561 args = [expr[x] for x in argIndices] 571 args = [expr[x] for x in argIndices]
562 argIndices = sorted (argIndices, reverse=True) 572 argIndices = sorted (argIndices, reverse=True)
563 printFunc (self.tabs + 'Processing: (%s, %d) with args %s' % (op, i, args)) 573 printFunc (self.tabs + 'Processing: (%s, %d) with args %s' % (op, i, args))
564 expr[i] = op.function (*args) 574 expr[i] = Value (op.function (*[x.value for x in args]))
565 printFunc (self.tabs + '-> %s' % expr[i]) 575 printFunc (self.tabs + '-> %s' % expr[i])
566 576
567 for i2 in argIndices: 577 for i2 in argIndices:
568 del expr[i2] 578 del expr[i2]
569 579
651 expr = self.parse_attributes (expr) 661 expr = self.parse_attributes (expr)
652 expr = self.tokenize (expr) 662 expr = self.tokenize (expr)
653 self.process_parens (expr) 663 self.process_parens (expr)
654 self.process_functions (expr) 664 self.process_functions (expr)
655 self.process_operators (expr) 665 self.process_operators (expr)
656 result = self.evaluate (expr, verbose) 666 result = self.evaluate (expr, verbose).value
657 return self.represent (result) 667 return self.represent (result)

mercurial