def METHOD_NAME(self) -> Tuple[Program, Program]:
    def match(o: SExp, expected: bytes) -> None:
        if o.atom != expected:
            raise ValueError(f"expected: {expected.hex()}")
    try:
        # (2 (1 . <mod>) <args>)
        ev, quoted_inner, args_list = self.as_iter()
        match(ev, b"\x02")
        match(quoted_inner.pair[0], b"\x01")
        mod = quoted_inner.pair[1]
        args = []
        while args_list.pair is not None:
            # (4 (1 . <arg>) <rest>)
            cons, quoted_arg, rest = args_list.as_iter()
            match(cons, b"\x04")
            match(quoted_arg.pair[0], b"\x01")
            args.append(quoted_arg.pair[1])
            args_list = rest
        match(args_list, b"\x01")
        return Program.to(mod), Program.to(args)
    except ValueError:  # too many values to unpack
        # when unpacking as_iter()
        # or when a match() fails
        return self, self.to(0)
    except TypeError:  # NoneType not subscriptable
        # when an object is not a pair or atom as expected
        return self, self.to(0)
    except EvalError:  # first of non-cons
        # when as_iter() fails
        return self, self.to(0)