Exemplo n.º 1
0
def _match(env: Env, scope: Scope, args):
    # print(f"(match {args})")
    # (match x pattern expr ...) -> expr | (match x ...)
    v = interp0(args[0], env, expr_scope, scope)[0]
    env._set(scope, "__match__tmp", v)
    GC(env).add(scope, ["__match__tmp"])
    pattern = args[1]
    for pattern, expr in zip(args[1::2], args[2::2]):
        # print(f"match {pattern} with {args[0]} at {scope}")
        if isinstance(pattern, list) and pattern[0] == "?":
            # (? fun args...)
            # print(pattern[1:] + [args[0]])
            val = interp0(pattern[1:] + ["__match__tmp"], env, expr_scope, scope)[0]
            if val:
                return interp0(expr, env, expr_scope, scope)[0]
            else:
                continue
        b = patternMatch(pattern, v)
        if b is not False:
            env._update(scope, b)
            val, _, _ = interp0(expr, env, expr_scope, scope)
            return val
    return None