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
Beispiel #3
0
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")
Beispiel #4
0
 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)
Beispiel #9
0
 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