lang F1 4.2: parameterized protocol as a runtime value type
VL(s64) used as a value/field type resolved to a 0-field stub (size 0); a
plain protocol was already a 16-byte {ctx,vtable} value. New
instantiateParamProtocol materializes a parameterized protocol per
instantiation: a 16-byte protocol value (is_protocol), protocol_decl_map
methods resolved under the type-arg binding (get -> T becomes get -> s64 for
VL(s64)), a vtable struct, and the type-arg binding recorded for projection.
Hooked into resolveParameterizedWithBindings before the empty-struct fallback.
xx-erasing a conforming struct into VL(s64)/VL(string) + method dispatch now
works (examples/206). This is the keystone for the canonical Combined field
(..VL(Ts)). 241 examples + unit green.
This commit is contained in:
22
examples/206-parameterized-protocol-value.sx
Normal file
22
examples/206-parameterized-protocol-value.sx
Normal file
@@ -0,0 +1,22 @@
|
||||
// Phase 4.2 — parameterized protocol as a runtime VALUE type. `VL(s64)` is a
|
||||
// 16-byte protocol value {ctx, vtable} (a plain protocol was already, but a
|
||||
// parameterized one used to resolve to a 0-field stub). A conforming struct
|
||||
// `xx`-erases into it, and method dispatch uses the bound type-arg
|
||||
// (`get -> T` becomes `get -> s64` for `VL(s64)`).
|
||||
|
||||
#import "modules/std.sx";
|
||||
|
||||
VL :: protocol(T: Type) { get :: () -> T; }
|
||||
IntCell :: struct { v: s64; }
|
||||
StrCell :: struct { s: string; }
|
||||
impl VL(s64) for IntCell { get :: (self: *IntCell) -> s64 => self.v; }
|
||||
impl VL(string) for StrCell { get :: (self: *StrCell) -> string => self.s; }
|
||||
|
||||
main :: () -> s32 {
|
||||
a : VL(s64) = xx IntCell.{ v = 42 };
|
||||
print("a.get={}\n", a.get()); // 42 (T = s64)
|
||||
|
||||
b : VL(string) = xx StrCell.{ s = "hi" };
|
||||
print("b.get={}\n", b.get()); // hi (T = string)
|
||||
0;
|
||||
}
|
||||
Reference in New Issue
Block a user