def evaluate_begin(es, r, k): if is_pair(es): if is_pair(es.cdr): return es.car.evaluate(r, BeginCont(k, es, r)) else: return es.car.evaluate(r, k) else: return k.resume(None)
def eprogn(exps, env): if is_pair(exps): if is_pair(exps.cdr): evaluate(exps.car, env) return eprogn(exps.cdr, env) else: return evaluate(exps.car, env) else: return None
def extend_env(env, names, values): if is_pair(names) and is_pair(values): return VariableEnv(extend_env(env, names.cdr, values.cdr), names.car, values.car) elif is_null(names) and is_null(values): return env elif is_symbol(names): return VariableEnv(env, names, values) else: raise TypeError("Arity mismatch")
def shanten_calc(divide_method): """计算分法的向听数,返回向听数""" pmeld_num = 0 pair_exist = False pmeld_exist_in_rest = False tiles_len = 0 for item in divide_method: tiles_len += len(item) meld_num = int((14 - tiles_len) / 3) for i in range(1, len(divide_method)): item = divide_method[i] if utils.is_chi(item) or utils.is_pon(item): meld_num += 1 elif utils.is_pair(item): pmeld_num += 1 pair_exist = True else: pmeld_num += 1 for tile in divide_method[0]: if utils.check_pair(tile, divide_method[0]): pair_exist = True pmeld_exist_in_rest = True if utils.check_pmeld_1(tile, divide_method[0]) or utils.check_pmeld_2( tile, divide_method[0]): pmeld_exist_in_rest = True shanten = 8 - 2 * meld_num - pmeld_num if pair_exist and pmeld_exist_in_rest: shanten -= 1 return shanten
def extend(env, variables, values): if is_pair(variables): if is_pair(values): return cons(cons(variables.car, values.car), extend(env, variables.cdr, values.cdr)) else: raise ValueError("Too few values") elif is_null(variables): if is_null(values): return env else: raise ValueError("Too many values") elif is_symbol(variables): return cons(cons(variables, values), env) else: raise RuntimeError("Branch should be unreachable")
def lookup(id, env): if is_pair(env): if env.caar == id: return env.cdar else: return lookup(id, env.cdr) raise ValueError("No such Binding: {}".format(id))
def update(id, env, value): if is_pair(env): if env.caar == id: env.cdar = value return value else: return update(id, env.cdr, value) raise ValueError("No such Binding: {}".format(id))
def __init__(self, *exprs): super().__init__() if len(exprs) == 0: self.exprs = Nil elif len(exprs) == 1 and is_pair(exprs[0]): self.exprs = exprs[0] else: self.exprs = Nil for x in exprs[::-1]: self.exprs = cons(x, self.exprs)
def check_pmeld_joint(pmeld_list, pmeld, tiles_code): """判断pmeld之间的独立性""" copy_code = tiles_code.copy() for a_pmeld in pmeld_list: copy_code = Shanten.remove_item(a_pmeld, copy_code) if utils.is_pair(pmeld): if utils.check_pair(pmeld[0], copy_code): return True return False if pmeld[0] in copy_code and pmeld[1] in copy_code: return True return False
def evaluate_arguments(es, r, k, no_more_arguments=Nil): if is_pair(es): return es.car.evaluate(r, ArgumentCont(k, es, r)) else: return k.resume(no_more_arguments)
def is_atom(expr): return not is_pair(expr)
def evlis(exps, env): if is_pair(exps): argument = evaluate(exps.car, env) return cons(argument, evlis(exps.cdr, env)) else: return Nil