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? |
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) |