コード例 #1
0
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?
コード例 #2
0
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)
コード例 #3
0
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)
コード例 #4
0
def is_atom(obj):
    return mal_types.MalBool(isinstance(obj, mal_types.MalAtom))
コード例 #5
0
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)
コード例 #6
0
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)
コード例 #7
0
def is_sequential(x):
    if isinstance(x, mal_types.list_types):
        return mal_types.MalBool(True)
    return mal_types.MalBool(False)
コード例 #8
0
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)
コード例 #9
0
 "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":
コード例 #10
0
def is_number(x):
    if isinstance(x, mal_types.MalNumber):
        return mal_types.MalBool(True)
    return mal_types.MalBool(False)
コード例 #11
0
def is_hash_map(x):
    if isinstance(x, mal_types.MalHashMap):
        return mal_types.MalBool(True)
    return mal_types.MalBool(False)
コード例 #12
0
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)
コード例 #13
0
def is_keyword(x):
    if isinstance(x, mal_types.MalKeyword):
        return mal_types.MalBool(True)
    return mal_types.MalBool(False)
コード例 #14
0
def is_symbol(x):
    if isinstance(x, mal_types.MalSymbol):
        return mal_types.MalBool(True)
    return mal_types.MalBool(False)
コード例 #15
0
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)
コード例 #16
0
def is_nil(x):
    if isinstance(x, mal_types.MalNil):
        return mal_types.MalBool(True)
    return mal_types.MalBool(False)
コード例 #17
0
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)
コード例 #18
0
def is_string(x):
    if isinstance(x, mal_types.MalString):
        return mal_types.MalBool(True)
    return mal_types.MalBool(False)