plum
git clone https://git.pyrossh.dev/plum
A statically typed, imperative programming language inspired by rust, python
150ffe9
— Peter John
2026-11-01T16:47:05+05:30
docs(plans): map literal done — progress, rulings, incidents
docs/plans/2026-11-01-map-literal.incidents.jsonl
ADDED
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
{"file": "docs/plans/2026-11-01-map-literal.review.md", "line": 0, "context": "T2: change outside Owns blocked by commit_task; nothing committed", "agent": "commit_task", "kind": "exception", "resolution": "open", "time": "16:38:30"}
|
|
2
|
+
{"file": "docs/plans/2026-11-01-map-literal.review.md", "line": 0, "context": "T2: change outside Owns blocked by commit_task; nothing committed", "agent": "commit_task", "kind": "exception", "resolution": "open", "time": "16:38:38"}
|
|
3
|
+
{"file": "plum-tooling/tree-sitter-plum/test/corpus/closure_match_arg.txt", "line": 0, "context": "T2: change outside Owns blocked by commit_task; nothing committed", "agent": "commit_task", "kind": "exception", "resolution": "open", "time": "16:38:38"}
|
|
4
|
+
{"file": "plum-tooling/tree-sitter-plum/test/corpus/pair_argument.txt", "line": 0, "context": "T2: change outside Owns blocked by commit_task; nothing committed", "agent": "commit_task", "kind": "exception", "resolution": "open", "time": "16:38:38"}
|
|
5
|
+
{"file": "plum-checker/tests/error_union_tests.rs", "line": 0, "context": "T2: change outside Owns blocked by commit_task; nothing committed", "agent": "commit_task", "kind": "exception", "resolution": "open", "time": "16:39:42"}
|
docs/plans/2026-11-01-map-literal.progress.md
ADDED
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
- start 1164924adc90c9110d7deb6e719a8e31ebe30dbc (zig-generics + game-language L1-L3)
|
|
2
|
+
- T1 ac67871; NOTE: Bool.toStr injected by the loader as a synthetic method — user rejected hardcoded loader preludes before; move into checker/codegen intrinsics (folded into T2)
|
|
3
|
+
- T2 a261b90; open: missing-method on primitive receivers lenient; chain line = calling decl line not statement
|
|
4
|
+
- QUEUED (user: fix them) after T3 commits, before T4: strict missing-method errors on primitive/builtin receivers in generic instantiations; called-at uses exact call expr line:col
|
|
5
|
+
- T3 3f7586e; open: generic fn as bare value unsupported
|
|
6
|
+
- fixes 0c02603: strict builtin methods + exact called-at
|
|
7
|
+
- T4 f1d676e; note: legacySyntaxHint is text-based, runs only after a failed parse
|
|
8
|
+
- T5+T6 ad8b044; open: enum/class fields can't hold fn types; closure calling fn-typed param -> 'unknown function'; closure literal as operator operand untested
|
|
9
|
+
- QUEUED T7 nullable sugar T? (after fn-field fixer, before L1)
|
|
10
|
+
- fix b952f81 fn-typed fields + closure fn-param capture (part of its code landed in 2485578 via coordinator's git commit -a — coordinator error, no loss)
|
|
11
|
+
- T7 dispatched 13:42
|
|
12
|
+
- QUEUED T8 near-free closures after L1-L3
|
|
13
|
+
- T7 12fd11a
|
|
14
|
+
- L1 1de3be3; open: List(...) const fails in codegen; const names global across modules (PI collision); nested call as arg to fn-typed field call -> 'unknown method Array.get'
|
|
15
|
+
- T8 ON HOLD: user must approve (bloat concern); exploring Pyret-style for-iteration instead
|
|
16
|
+
- L2 8d065f8; L3 (operators on value enums) covered by L2 test value_operator_add_mul + T5; limits: nested value-enum pattern destructuring, p.pos.x = via heap field rejected
|
|
17
|
+
- T8 redefined (user): for-forms with existing for := syntax + inline user forms (block params); NOT run yet
|
|
18
|
+
- tests fast passed=1 failed=0 skipped=0 seconds=21.4
|
|
19
|
+
- fixes 85ed0b1: fn-field nested arg, List consts (lazy global), nested value patterns, p.pos.x RMW
|
|
20
|
+
- T8 approved by user to run after duplicate-const fix
|
|
21
|
+
- dup consts 54233aa+80110ec; T8a dispatched
|
|
22
|
+
- T8a f359218; BUG to fix in T8b: 'if' clause skips when TRUE (must keep-when-true guard); ruling: iteration protocol length()+at(i)
|
|
23
|
+
- T8b 081a24a; concerns: inline fn bodies untyped (checked only after expansion); filter/find need List; for-expr only as assign RHS; pre-existing 'interpolating Unit' bug after List()+push in tests
|
|
24
|
+
- review 3ca3f26; residuals: closure param typed only by a later call fails; V2-style type names lex as const; match not an expression; f(for ...) parse error
|
|
25
|
+
- T9 2dd6150; residual: untyped List() passed to a free generic fn fails codegen
|
|
26
|
+
- merged range-in-iter (72527fb, 378ab1a); typed-for branch started; ZIG ERRORS PLAN: user must verify before starting
|
|
27
|
+
- zig-errors branch; plan committed; audit then E1-E4
|
|
28
|
+
- QUEUED pre-task R (Int loop methods) after audit, before E1
|
|
29
|
+
- R 7b55840: for x := range src; Int until/to/downTo; global range removed. E1 dispatched
|
|
30
|
+
- QUEUED task B true/false after E1, before E2; PENDING user answer: dot-syntax variants (.Circle / Shape.Circle)
|
|
31
|
+
- E1 0240835; CONCERN: pinned set distinguished from generics by whitespace + formatter name list — fix in E2. Task B dispatched
|
|
32
|
+
- B 405c23f true/false; E2 dispatched
|
|
33
|
+
- E2 5b4ec0a; OPEN (user): postfix ? binds loose due to ternary — replace ternary with if-then-else?; E3 dispatched
|
|
34
|
+
- E3 a8f2482; E4 dispatched (ternary kept pending user)
|
|
35
|
+
- error-sets plan approved; S1-S3 dispatched as one agent
|
|
36
|
+
- user: SKIP fixes (closure ?, formatter); order now audit -> task N
|
|
37
|
+
- QUEUED task NL: null literal for absence, after N
|
|
38
|
+
- tests full passed=422 failed=0 skipped=0 seconds=21.7
|
|
39
|
+
Ruling: approved review plan 2026-11-01-map-literal
|
|
40
|
+
Ruling: approved review plan 2026-11-01-map-literal
|
|
41
|
+
- start b0d445d89564a99fbb8a7b18fffc06eeb2025e32
|
|
42
|
+
- Ruling: skip T0 wave0 - every stub file already exists in this repo (brief says never overwrite), so T0 is a no-op and Rust stubs would break the build - cost if wrong: none, no consumer imports a new file
|
|
43
|
+
- unblocked: dispatched T1 T2 at 16:36:38; waiting on fixes: T3
|
|
44
|
+
- commit T2 8ef7e9af1c Map.init variadic
|
|
45
|
+
- commit T2-review c3ccbc9485 by name (commit_task blocked by T1's in-flight plum-checker/tests file)
|
|
46
|
+
- commit T1 3f6f3f566d by name (extra owned-by-brief files: 2 corpus, error_union_tests.rs)
|
|
47
|
+
- Ruling: Pair hint placed at checker unknown-call site, not lookup() - lookup never sees unknown fn calls - cost if wrong: hint missing in some other position, cosmetic
|
|
48
|
+
- Ruling: closure-match corpus uses block-body closure form - inline match-in-closure is not valid Plum - cost: none
|
|
49
|
+
- commit T3 00caf49c59 by name (T1 reviewer has in-flight files)
|
|
50
|
+
- tests full passed=430 failed=0 skipped=0 seconds=34.0
|
|
51
|
+
- Ruling: final-review "contract mismatch" is parser.parseArg's real signature `fn parseArg(&self, node: Node) -> Arg` vs the plan's `(node: pair_argument)` (naming only; behavior is asserted by pairArgDesugarsToPairCall) - cost if wrong: none
|
|
52
|
+
- Ruling: "unverified category" = no probe adapter run; the categories are covered by named tests (Map.plum init_* blocks, plum-examples/maps.plum, parser_test pairArg*) - cost if wrong: an uncaught edge case in those categories
|
|
53
|
+
- verified: cargo test --workspace 430/0; debug + fresh release plum test plum-std plum-examples 2531/0, 51/51; tree-sitter corpus 83/83 (the debug-build literal-overflow error is gone since 287a0ad)
|
docs/plans/2026-11-01-map-literal.review.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Map constructor with `key => value` pairs (review plan)
|
|
2
2
|
|
|
3
|
-
**Status:**
|
|
3
|
+
**Status:** done (approved and built 2026-11-01; see 2026-11-01-map-literal.md).
|
|
4
4
|
|
|
5
5
|
## Goal
|
|
6
6
|
Build a map in one expression, the same way `List(1, 2, 3)` builds a list:
|