lang F1 6: contextually type pack-fn prefix args (mapper lambda)
lowerPackFnCall lowered the runtime prefix args with no target_type, so a lambda arg (mapper: Closure(...) -> ...) could not infer its param types. Now set target_type to the param type while lowering each prefix arg. With the existing value-projection call-arg spread, mapper(..sources.get) works: the lambda is contextually typed and the projected values spread into the call. examples/211 ((a,b)=>a+b over two sources -> 42). 246 + unit green.
This commit is contained in:
18
examples/211-mapper-projection-spread.sx
Normal file
18
examples/211-mapper-projection-spread.sx
Normal file
@@ -0,0 +1,18 @@
|
||||
// Phase 6 — `mapper(..sources.value)`: project a method over a pack and spread
|
||||
// the results into a closure call. The mapper lambda's params are contextually
|
||||
// typed from the `Closure(...)` parameter even though `apply` is a pack-fn.
|
||||
|
||||
#import "modules/std.sx";
|
||||
|
||||
VL :: protocol(T: Type) { get :: () -> T; }
|
||||
IntCell :: struct { v: s64; }
|
||||
impl VL(s64) for IntCell { get :: (self: *IntCell) -> s64 => self.v; }
|
||||
|
||||
apply :: (mapper: Closure(s64, s64) -> s64, ..sources: VL) -> s64 {
|
||||
return mapper(..sources.get); // (a, b) => a + b applied to (s0.get(), s1.get())
|
||||
}
|
||||
|
||||
main :: () -> s32 {
|
||||
print("{}\n", apply((a, b) => a + b, IntCell.{ v = 40 }, IntCell.{ v = 2 })); // 42
|
||||
0;
|
||||
}
|
||||
@@ -9195,7 +9195,13 @@ pub const Lowering = struct {
|
||||
if (isPackParam(p)) break;
|
||||
if (ri >= call_node.args.len) break;
|
||||
if (!p.is_comptime) {
|
||||
// Contextually type the arg from the param (so a lambda arg
|
||||
// `(x) => …` takes its param types from a `Closure(...)` param).
|
||||
const saved_tt = self.target_type;
|
||||
const pty = self.resolveParamType(&p);
|
||||
if (pty != .unresolved) self.target_type = pty;
|
||||
args.append(self.alloc, self.lowerExpr(call_node.args[ri])) catch return self.builder.constInt(0, .void);
|
||||
self.target_type = saved_tt;
|
||||
}
|
||||
ri += 1;
|
||||
}
|
||||
|
||||
1
tests/expected/211-mapper-projection-spread.exit
Normal file
1
tests/expected/211-mapper-projection-spread.exit
Normal file
@@ -0,0 +1 @@
|
||||
0
|
||||
1
tests/expected/211-mapper-projection-spread.txt
Normal file
1
tests/expected/211-mapper-projection-spread.txt
Normal file
@@ -0,0 +1 @@
|
||||
42
|
||||
Reference in New Issue
Block a user