def read_atom(reader): token = reader.peek() try: val = int(token) return mal_types.MalNumber(val) except ValueError: pass if token in _quote_mapping: reader.next() return mal_types.MalList( [mal_types.MalSymbol(_quote_mapping[token]), read_form(reader)]) elif token == '^': reader.next() meta_data = read_form(reader) reader.next() lst = read_form(reader) return mal_types.MalList( [mal_types.MalSymbol("with-meta"), lst, meta_data]) elif token.startswith('"') and token.endswith('"'): return mal_types.MalString( bytes(token[1:-1], "utf-8").decode("unicode_escape")) elif token.startswith(":"): return mal_types.MalKeyword(token) elif token in ('true', 'false'): if token == 'true': return mal_types.MalBool(True) return mal_types.MalBool(False) elif token == 'nil': return mal_types.MalNil() return mal_types.MalSymbol(token) # symbol?
def is_empty(x): # print('&&&&in is empty?', x) if isinstance(x, mal_types.list_types): return mal_types.MalBool(len(x) == 0) if isinstance(x, mal_types.MalNil): return mal_types.MalBool(True) return mal_types.MalBool(False)
def equal(a, b): if isinstance(a, mal_types.list_types) and isinstance( b, mal_types.list_types): if len(a) != len(b): return mal_types.MalBool(False) for x, y in zip(a, b): if not equal(x, y): return mal_types.MalBool(False) return mal_types.MalBool(True) if type(a) != type(b): return mal_types.MalBool(False) if isinstance(a, mal_types.MalHashMap) and isinstance( b, mal_types.MalHashMap): if len(a) != len(b): return mal_types.MalBool(False) # todo hashmap equal return mal_types.MalBool(a.data == b.data)
def is_atom(obj): return mal_types.MalBool(isinstance(obj, mal_types.MalAtom))
def is_macro(x): #fixme if isinstance(x, mal_types.MalFn) or isinstance(x, types.FunctionType): return mal_types.MalBool(True) return mal_types.MalBool(False)
def is_function(x): if isinstance(x, mal_types.MalFn) or isinstance(x, types.FunctionType): return mal_types.MalBool(True) return mal_types.MalBool(False)
def is_sequential(x): if isinstance(x, mal_types.list_types): return mal_types.MalBool(True) return mal_types.MalBool(False)
def is_contains(x, key): if isinstance(x, mal_types.MalHashMap) and key in x: return mal_types.MalBool(True) return mal_types.MalBool(False)
"contains?": is_contains, "keys": keys, "vals": vals, "sequential?": is_sequential, "empty?": is_empty, "count": lambda x: mal_types.MalNumber(len(x)), "=": equal, "<": lambda x, y: mal_types.MalBool(x.data < y.data), "<=": lambda x, y: mal_types.MalBool(x.data <= y.data), ">": lambda x, y: mal_types.MalBool(x.data > y.data), ">=": lambda x, y: mal_types.MalBool(x.data >= y.data), "pr-str": lambda *args: mal_types.MalString(" ".join( [pr_str(i, print_readably=True) for i in args])), "str": lambda *args: mal_types.MalString("".join( [pr_str(i, print_readably=False) for i in args])), "prn": prn, "println":
def is_number(x): if isinstance(x, mal_types.MalNumber): return mal_types.MalBool(True) return mal_types.MalBool(False)
def is_hash_map(x): if isinstance(x, mal_types.MalHashMap): return mal_types.MalBool(True) return mal_types.MalBool(False)
def is_vector(x): # print('**is_vector', x, type(x)) if isinstance(x, mal_types.MalVector): return mal_types.MalBool(True) return mal_types.MalBool(False)
def is_keyword(x): if isinstance(x, mal_types.MalKeyword): return mal_types.MalBool(True) return mal_types.MalBool(False)
def is_symbol(x): if isinstance(x, mal_types.MalSymbol): return mal_types.MalBool(True) return mal_types.MalBool(False)
def is_false(x): if isinstance(x, mal_types.MalBool) and x.data is False: return mal_types.MalBool(True) return mal_types.MalBool(False)
def is_nil(x): if isinstance(x, mal_types.MalNil): return mal_types.MalBool(True) return mal_types.MalBool(False)
def is_list(x): #print("is_list?", x, type(x), isinstance(x, mal_types.MalList)) if isinstance(x, mal_types.MalList): return mal_types.MalBool(True) return mal_types.MalBool(False)
def is_string(x): if isinstance(x, mal_types.MalString): return mal_types.MalBool(True) return mal_types.MalBool(False)