Move examples/*.sx and their expected/ snapshots into per-category subfolders (examples/<category>/...). Folder = leading filename token, with ffi-objc/ffi-jni kept whole; filenames are unchanged. The corpus runner and LSP sweep now discover each category's expected/ dir, while issues/ stays flat. Example 1058's repo-root-relative companion import is made file-relative. Path strings embedded in 164 snapshots were regenerated (path-only changes). Test-layout docs in CLAUDE.md updated.
26 lines
963 B
Plaintext
26 lines
963 B
Plaintext
// Phase 4.2 (core) — a generic struct with a pack type-param `..$Ts: []Type`
|
|
// and a pack-shaped tuple field `(..$Ts)`. Each instantiation binds the
|
|
// remaining type args as the pack, so the field is a tuple of those per-position
|
|
// types. Storing the whole tuple field and reading its elements both work.
|
|
|
|
#import "modules/std.sx";
|
|
|
|
Box :: struct($R: Type, ..$Ts: []Type) {
|
|
r: $R;
|
|
pair: (..$Ts); // tuple of the pack's element types
|
|
}
|
|
|
|
main :: () -> i32 {
|
|
// Box(i64, i32, string): R=i64, Ts=[i32, string], pair: (i32, string).
|
|
a : Box(i64, i32, string) = ---;
|
|
a.r = 7;
|
|
a.pair = (42, "hi"); // whole-tuple field store
|
|
print("a: r={} 0={} 1={}\n", a.r, a.pair.0, a.pair.1);
|
|
|
|
// A different shape → a different per-position tuple field.
|
|
b : Box(bool, string, bool) = ---; // Ts=[string, bool], pair: (string, bool)
|
|
b.pair = ("x", true);
|
|
print("b: 0={} 1={}\n", b.pair.0, b.pair.1);
|
|
0
|
|
}
|