ffi M5.A.next.1a: variadic heterogeneous type packs — parse lockin
First slice of the `..$args` (variadic heterogeneous type pack)
feature. Locks in the current parser-rejection behavior so the
next commit's parser extension shows up as a behavior shift.
`examples/150-pack-parse.sx` declares `foo :: (..$args) -> s64`.
Today's parser hits `..` where it expects a parameter name
(parseParams in src/parser.zig:1558 only handles `..` inside the
type position after a colon) and emits "expected parameter name".
Expected output captures this rejection.
Per FFI cadence rule, this is the "test fails today, passes after
next commit's parser change" pair.
Pack feature plan saved at
~/.claude/plans/lets-see-options-for-merry-dijkstra.md ("Variadic
heterogeneous type packs" section). Motivates replacing the
hand-rolled per-signature `Into(Block)` impls with one generic
`impl Into(Block) for Closure(..$args) -> $R`; also unlocks
compile-time arity/type errors for `print`/`format`.
191/191 example tests + `zig build test` green.
This commit is contained in:
@@ -6,6 +6,39 @@ add a test and make it pass — that's two commits).
|
||||
|
||||
## Last completed step
|
||||
|
||||
**M5.A.next.1a — variadic heterogeneous type packs: parse lockin**
|
||||
(this commit).
|
||||
|
||||
First slice of the `..$args` (variadic heterogeneous type pack)
|
||||
feature per the plan saved at
|
||||
`~/.claude/plans/lets-see-options-for-merry-dijkstra.md` (see the
|
||||
"Variadic heterogeneous type packs" section). Locks in the
|
||||
current parser-rejection behavior so the next commit's parser
|
||||
extension shows up as a behavior shift.
|
||||
|
||||
New: `examples/150-pack-parse.sx` declares
|
||||
`foo :: (..$args) -> s64`. Today's parser hits `..` where it
|
||||
expects a parameter name (after parsing the leading `dollar`
|
||||
sigil that doesn't appear) and emits "expected parameter name"
|
||||
at column 9 of line 15. Expected output captures this rejection.
|
||||
|
||||
Per FFI cadence rule, this is a "test that fails today, passes
|
||||
after the next commit's parser change" pair. The next commit
|
||||
extends `parseParams()` (src/parser.zig:1558) to accept `..` at
|
||||
the start of a parameter — currently the parser only handles `..`
|
||||
inside the type position (after the colon).
|
||||
|
||||
191 example tests + `zig build test` green.
|
||||
|
||||
The pack feature itself lives in the FFI stream because its
|
||||
primary motivation is replacing the hand-rolled per-signature
|
||||
`Into(Block)` impls in `library/modules/std/objc_block.sx` with
|
||||
one generic `impl Into(Block) for Closure(..$args) -> $R`. Payoff
|
||||
extends beyond blocks — `print`/`format` get compile-time arity
|
||||
and type-mismatch errors instead of `..Any` runtime tag dispatch.
|
||||
|
||||
---
|
||||
|
||||
**M1.2 A.0 — `objc_defined_class_cache` + scan-pass registration**
|
||||
(`61a2593`).
|
||||
|
||||
|
||||
22
examples/150-pack-parse.sx
Normal file
22
examples/150-pack-parse.sx
Normal file
@@ -0,0 +1,22 @@
|
||||
// Variadic heterogeneous type packs — `..$args` — parse lockin.
|
||||
//
|
||||
// First slice of the pack feature: the parser does not yet accept
|
||||
// `..$args` (variadic-marker + comptime sigil + name, no type
|
||||
// annotation). This test pins the current parse-rejection so the
|
||||
// next commit's parser change is visible as a behavior shift.
|
||||
//
|
||||
// Expected next commit: parser accepts `..$args` and this test
|
||||
// either flips to a successful parse (compile error from later
|
||||
// passes that haven't been wired up yet) or is replaced by a
|
||||
// positive test.
|
||||
|
||||
#import "modules/std.sx";
|
||||
|
||||
foo :: (..$args) -> s64 {
|
||||
return 0;
|
||||
}
|
||||
|
||||
main :: () -> s32 {
|
||||
print("never reached\n");
|
||||
return 0;
|
||||
}
|
||||
1
tests/expected/150-pack-parse.exit
Normal file
1
tests/expected/150-pack-parse.exit
Normal file
@@ -0,0 +1 @@
|
||||
1
|
||||
1
tests/expected/150-pack-parse.txt
Normal file
1
tests/expected/150-pack-parse.txt
Normal file
@@ -0,0 +1 @@
|
||||
/Users/agra/projects/sx/examples/150-pack-parse.sx:15:9: error: expected parameter name
|
||||
Reference in New Issue
Block a user