예제 #1
0
def apply(x, *y):
    assert type(y[-1] == MalList)
    tmp = MalList("(")
    for i in y[:-1]:
        tmp.append(i)
    tmp.extend(y[-1])
    if type(x) == dict:
        return x["fn"](*tmp)
    else:
        return x(*tmp)
예제 #2
0
    def __init__(self, outer: Env, binds=None, exprs=None):
        if binds is None:
            binds = []
        if exprs is None:
            exprs = []

        self.outer = outer
        self.data = {}
        for i in range(len(binds)):
            if binds[i] == "&":
                rest_exprs = MalList("(")
                rest_exprs.extend(exprs[i:])
                self.data[binds[i + 1]] = rest_exprs
                break
            self.data[binds[i]] = exprs[i]
예제 #3
0
def dissoc(x, *y):
    assert type(x) == MalList and x.opener == "{"

    tmp = MalList("{")
    tmp.extend(x)
    for next_key in y:
        idx = -1
        for i in range(0, len(tmp), 2):
            if tmp[i] == next_key:
                idx = i
                break
        if idx == -1:
            continue
        del tmp[idx:idx + 2]

    return tmp
예제 #4
0
def vec(a):
    temp = MalList("[")
    temp.extend(a)
    return temp
예제 #5
0
def list_fn(*x):
    lst = MalList("(")
    lst.extend(x)
    return lst
예제 #6
0
def hash_map(*x):
    assert len(x) % 2 == 0
    tmp = MalList("{")
    tmp.extend(x)
    return tmp