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)
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]
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
def vec(a): temp = MalList("[") temp.extend(a) return temp
def list_fn(*x): lst = MalList("(") lst.extend(x) return lst
def hash_map(*x): assert len(x) % 2 == 0 tmp = MalList("{") tmp.extend(x) return tmp