def evaluate_value(value, environment): if isinstance(value, Integer): return value elif isinstance(value, Float): return value elif isinstance(value, Fraction): return value elif isinstance(value, Boolean): return value elif isinstance(value, Null): return value elif isinstance(value, Keyword): return value # String and bytestring literals should evaluate to a copy of # themselves, so we can safely use string literals in function # bodies and then mutate them. elif isinstance(value, String): char_list = value.string return String([char for char in char_list]) elif isinstance(value, Bytestring): byte_list = value.byte_value return Bytestring([byte for byte in byte_list]) # Likewise for hashmap literals. # TODO: Should this be a deep copy? elif isinstance(value, Hashmap): hashmap = Hashmap() hashmap.dict = value.dict.copy() return hashmap elif isinstance(value, Character): return value elif isinstance(value, Lambda): return value elif isinstance(value, Function): return value elif isinstance(value, Macro): return value elif isinstance(value, TrifleExceptionInstance): return value elif isinstance(value, TrifleExceptionType): return value elif isinstance(value, Macro): return value elif isinstance(value, Symbol): symbol_name = value.symbol_name if environment.contains(symbol_name): return environment.get(symbol_name) else: # TODO: suggest variables with similar spelling. return TrifleExceptionInstance( no_such_variable, u"No such variable defined: '%s'" % symbol_name) else: assert False, "I don't know how to evaluate that value: %s" % value