define method seq (#rest sub-rules :: ) => (rule :: ) method (stream) => (success, tokens) let pos = stream.stream-position; let product = make(); let failed = #f; for (rule in sub-rules, until: failed) let (success, tokens) = rule(stream); if (success) product := product.add!(tokens) else failed := rule end if end for; if (failed) stream.stream-position := pos; product := make(, format-string: "Expected %s", format-args: $rule-names[rule]) end if; values(~failed, product) end method end method;