Files
sx/examples/150-pack-parse.sx
agra a51fe26cbf ffi M5.A.next.1b: parser accepts ..$args as a variadic-pack param
Extends parseParams in src/parser.zig:1558 to recognize a leading
`..` before the optional `$` sigil and the parameter name. The
old `args: ..T` form (variadic marker after the colon) still
works — both paths set the same `is_variadic` flag.

A pack declaration `..$args` parses as:
- `is_variadic = true` (from the leading `..`)
- `is_comptime = true` (from the `$` sigil)
- `type_expr = inferred_type` (no `:` annotation)

The no-colon branch now propagates `is_variadic` and `is_comptime`
onto the Param struct so later slices (type rep, impl matching,
monomorphisation) can read both flags from the parsed AST without
re-deriving from token sequence.

`examples/150-pack-parse.sx` flips from rejecting-with-error to
positive parse smoke. No semantic effect yet — `foo` is declared
but never instantiated.

191/191 example tests + `zig build test` green.
2026-05-27 09:49:41 +03:00

23 lines
675 B
Plaintext

// Variadic heterogeneous type packs — `..$args` — parse smoke.
//
// First positive slice of the pack feature: the parser accepts
// `..$args` (variadic marker + comptime sigil + name) as a
// parameter declaration. No semantic effect yet — the function
// is declared but never instantiated; main exists so the example
// has runnable output.
//
// Next slices: type-system representation of the pack, impl
// matching for `Closure(..$args) -> $R`, runtime indexing
// (`args[$i]`), and the `#insert build_x($args, ...)` pattern.
#import "modules/std.sx";
foo :: (..$args) -> s64 {
return 0;
}
main :: () -> s32 {
print("pack parse ok\n");
return 0;
}