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