Procházet zdrojové kódy

docs: record the WITH / n-dimensional subscript rung (ladder 15131)

CALC-COMPILE.md: the rung table gains v-TP3-CALC-WITH (a559843,
ERR 102 15131), the session state says twenty-two rungs, the baseline is
the run just made (78/78 compile, 67/67 executed under both oracles,
non-vacuity 99/99), item 4 is marked done (n-D subscripts and WITH), and
the next item is the set/string assignment to a record field.

SUMMARY.md: the intro now stops at ERR 102 15131 and lists WITH and n-D
subscripts among the landed features.
Eric Streit před 1 dnem
rodič
revize
340ac363fb
2 změnil soubory, kde provedl 37 přidání a 27 odebrání
  1. 32 23
      CALC-COMPILE.md
  2. 5 4
      SUMMARY.md

+ 32 - 23
CALC-COMPILE.md

@@ -97,7 +97,7 @@ Current rung (measured today, normalised position):
 
 
 | position | blocker |
 | position | blocker |
 |---|---|
 |---|---|
-| **15026** | `with Sheet[I,J] do` in `DisplayP` — a 2-D subscript and `with` (`ERR 102`) |
+| **15131** | `CellStatus := [Txt]` in `Init` — a SET assignment to a record field (`ERR 102`) |
 
 
 Rungs behind it (now passed):
 Rungs behind it (now passed):
 
 
@@ -119,12 +119,13 @@ Rungs behind it (now passed):
 | 13052 | comma-separated CASE labels | plus real CASE ranges (`t74_caselist`) |
 | 13052 | comma-separated CASE labels | plus real CASE ranges (`t74_caselist`) |
 | 14195 | variable array subscripts | scaled addressing, 1 byte or 2 (`t75_arrvar`) |
 | 14195 | variable array subscripts | scaled addressing, 1 byte or 2 (`t75_arrvar`) |
 | 14330 | write field widths | `wrintw`, runtime 770 -> 878 (`t76_width`) |
 | 14330 | write field widths | `wrintw`, runtime 770 -> 878 (`t76_width`) |
+| 15026 | WITH + n-D subscripts | row strides, fields via DI (`t77_with`) |
 
 
 Rungs ahead:
 Rungs ahead:
 
 
 | position | blocker |
 | position | blocker |
 |---|---|
 |---|---|
-| 15026 | 2-D subscripts (`Sheet[I,J]`, row stride) and `with`; then the rest of `CALC.INC` |
+| 15131 | set/string assignment to a record field; then the rest of `CALC.INC` |
 
 
 Corrections the measurements force, worth stating plainly because the stage list
 Corrections the measurements force, worth stating plainly because the stage list
 below was written before them:
 below was written before them:
@@ -398,13 +399,14 @@ ladder order (each stage removes the blocker the previous one exposed).
 
 
 ### Session state — where to resume
 ### Session state — where to resume
 
 
-Last touched 2026-10-21. **Twenty-one rungs are landed across three sessions**
+Last touched 2026-10-21. **Twenty-two rungs are landed across three sessions**
 (Stages 1-4, sets, enums, record types, array declarations, element/field
 (Stages 1-4, sets, enums, record types, array declarations, element/field
 access, file types, the calling convention and string value parameters,
 access, file types, the calling convention and string value parameters,
 `Length`, the CRT identifiers, `Kbd`, `KeyPressed`, `var` parameters, the CASE
 `Length`, the CRT identifiers, `Kbd`, `KeyPressed`, `var` parameters, the CASE
-labels, variable array subscripts, and write field widths).  The ladder row has
-moved from the first typed constant at 7791 to **15026, inside `CALC.INC`'s
-`DisplayP` — `with Sheet[I,J] do`, the 2-D subscript and `with`**.
+labels, variable array subscripts, write field widths, and WITH with
+n-dimensional subscripts).  The ladder row has moved from the first typed
+constant at 7791 to **15131, inside `CALC.INC`'s `Init` — `CellStatus :=
+[Txt]`, a set assignment to a record field**.
 
 
 The rung commits and their tags, in order (each is one rung with its own
 The rung commits and their tags, in order (each is one rung with its own
 fixture, red proof, and — where the harness allows — execution under qemu and
 fixture, red proof, and — where the harness allows — execution under qemu and
@@ -432,10 +434,11 @@ Exec86):
 | `5eb82c4` | `v-TP3-CALC-VARPARAM` | `ERR 1 13052` (comma-separated CASE labels) |
 | `5eb82c4` | `v-TP3-CALC-VARPARAM` | `ERR 1 13052` (comma-separated CASE labels) |
 | `8a265e7` | `v-TP3-CALC-CASELIST` | `ERR 102 14195` (variable array subscript) |
 | `8a265e7` | `v-TP3-CALC-CASELIST` | `ERR 102 14195` (variable array subscript) |
 | `b41c669` | `v-TP3-CALC-ARRVAR` | `ERR 1 14330` (write field width) |
 | `b41c669` | `v-TP3-CALC-ARRVAR` | `ERR 1 14330` (write field width) |
-| `099f8fd` | `v-TP3-CALC-WIDTH` | **`ERR 102 15026`** (2-D subscript + `with`) |
+| `099f8fd` | `v-TP3-CALC-WIDTH` | `ERR 102 15026` (2-D subscript + `with`) |
+| `a559843` | `v-TP3-CALC-WITH` | **`ERR 102 15131`** (set assignment to a field) |
 
 
-- **Code HEAD** `099f8fd` (`v-TP3-CALC-WIDTH`); this commit only updates
-  this document.  Nothing pushed; `origin/master` is behind by fourteen code
+- **Code HEAD** `a559843` (`v-TP3-CALC-WITH`); this commit only updates
+  this document.  Nothing pushed; `origin/master` is behind by fifteen code
   commits.  Two non-ladder commits in the same period are the terminal-config
   commits.  Two non-ladder commits in the same period are the terminal-config
   work (`v-TP3-TERMCFG`) and the editor key map (`v-TP3-EDITORKEYS`); they do
   work (`v-TP3-TERMCFG`) and the editor key map (`v-TP3-EDITORKEYS`); they do
   not move the ladder and are documented in `TERMINAL.md`.
   not move the ladder and are documented in `TERMINAL.md`.
@@ -537,11 +540,11 @@ Exec86):
   byte-for-byte the same for INTEGER locals, so the compile matrix would have
   byte-for-byte the same for INTEGER locals, so the compile matrix would have
   been green and only `t40_readln` (and later CALC) would have noticed.
   been green and only `t40_readln` (and later CALC) would have noticed.
 - **Verified baseline, run on the code HEAD above:** `./tests/run_all.sh` →
 - **Verified baseline, run on the code HEAD above:** `./tests/run_all.sh` →
-  **OVERALL: ALL PASS**, compile matrix **77/77**, CALC ladder **1/1** at
-  `ERR 102 15026`, terminal config **4/4**, 64 `.COM` linked and **66 executed
+  **OVERALL: ALL PASS**, compile matrix **78/78**, CALC ladder **1/1** at
+  `ERR 102 15131`, terminal config **4/4**, 64 `.COM` linked and **67 executed
   under both qemu and Exec86** (`t64_arrays` is compile-only: its image is past
   under both qemu and Exec86** (`t64_arrays` is compile-only: its image is past
-  the 8 KB boot-sector read).  `tests/nonvacuity.sh`: **97 ok, 0 failed**.
-  The runtime is now 878 bytes (wrintw added; the golden was re-blessed).
+  the 8 KB boot-sector read).  `tests/nonvacuity.sh`: **99 ok, 0 failed**.
+  The runtime is 878 bytes (wrintw added; the golden was re-blessed).
 - **`tests/nonvacuity.sh`:** re-run after this commit's cases (the set
 - **`tests/nonvacuity.sh`:** re-run after this commit's cases (the set
   membership bit among them); see the commit message for the count. It is not in
   membership bit among them); see the commit message for the count. It is not in
   the default `run_all.sh` and must be run **manually** after touching any check.
   the default `run_all.sh` and must be run **manually** after touching any check.
@@ -577,8 +580,8 @@ Exec86):
 
 
 ### Next session — the concrete plan
 ### Next session — the concrete plan
 
 
-The ladder is at `ERR 102 15026`, **`with Sheet[I,J] do` — a 2-D
-subscript and `with`**.  Everything
+The ladder is at `ERR 102 15131`, **`CellStatus := [Txt]` — a set
+assignment to a record field**.  Everything
 below is ordered by what the ladder will hit next, not by the original stage
 below is ordered by what the ladder will hit next, not by the original stage
 numbers (the measurements have reordered them repeatedly).  Each item is the
 numbers (the measurements have reordered them repeatedly).  Each item is the
 same shape as the rungs already landed: one focused change, one fixture that is
 same shape as the rungs already landed: one focused change, one fixture that is
@@ -603,14 +606,12 @@ commit.
    `IoResult`; `read`/`write` with a leading file argument).  Runtime entries
    `IoResult`; `read`/`write` with a leading file argument).  Runtime entries
    doing `INT 21h` open/create/read/write/close, text-mode newline and `^Z`.
    doing `INT 21h` open/create/read/write/close, text-mode newline and `^Z`.
    The file *types* and variables are already in place (`FileVarSize`).
    The file *types* and variables are already in place (`FileVarSize`).
-4. **Array subscripts — DONE, 1-D; THE NEXT RUNG is 2-D + `with` (15026).**
-   A run-time index is `(i - lo) * elemsize` from the base, with the element's
-   address in DI; one and two bytes are loaded/stored.  **Still open:**
-   `Sheet[I,J]` needs the row stride `(hi1 - lo1 + 1) * elem` accumulated
-   across dimensions, and `with Sheet[I,J] do` needs the ELEMENT's record
-   field table to follow the DI-addressed element (today `.field` uses the
-   array symbol's table).  Both are the same "element type travels with the
-   expression" change.
+4. **Array subscripts and `with` — DONE** (`v-TP3-CALC-ARRVAR`,
+   `v-TP3-CALC-WITH`): n-dimensional subscripts use per-dimension strides
+   (the last varies fastest), the element's address rides in DI, and `with`
+   resolves fields against a scope stack, parking a DI base in a data slot.
+   Constant-index elements stay symbol+offset.  Field reads/writes one or two
+   bytes wide work; wider fields are the next item.
 5. **Pointers and the heap** (`^T`, `New`, `Dispose`, `Buffer^[i]`), 4-byte
 5. **Pointers and the heap** (`^T`, `New`, `Dispose`, `Buffer^[i]`), 4-byte
    (offset then segment); the heap must hold `Pages` (16,281 bytes).
    (offset then segment); the heap must hold `Pages` (16,281 bytes).
 6. **`var` parameters by reference — DONE** (`v-TP3-CALC-VARPARAM`).  The slot
 6. **`var` parameters by reference — DONE** (`v-TP3-CALC-VARPARAM`).  The slot
@@ -646,6 +647,14 @@ Then the two that are *outside* the ladder and gate the goal as stated:
     `Value:FW:DEC`, which waits for real support) and widths on
     `Value:FW:DEC`, which waits for real support) and widths on
     CHAR/BOOLEAN/STRING, which are loud today.
     CHAR/BOOLEAN/STRING, which are loud today.
 
 
+15. **SET and STRING assignments to a record field — THE NEXT RUNG (15131).**
+    `CellStatus := [Txt]` is the first: the target is `set of Attributes`
+    (one byte), so the RHS set constructor must take its base/size from the
+    TARGET rather than defaulting to 32-byte `set of Char`, and the store
+    must go through DI.  `Contents := ''`/`Contents := S` follows on the same
+    addressing with a counted-string copy (or a runtime entry taking a DI
+    destination).  Both are loud today.
+
 14. **Raise the execution harness's read.**  `tests/exec/bootcom.s` reads 16
 14. **Raise the execution harness's read.**  `tests/exec/bootcom.s` reads 16
     sectors (8192 bytes); `t64_arrays` is already compile-only for that reason,
     sectors (8192 bytes); `t64_arrays` is already compile-only for that reason,
     and CALC's measured `.COM` is **27,901 bytes**.  Without this, "executable
     and CALC's measured `.COM` is **27,901 bytes**.  Without this, "executable

+ 5 - 4
SUMMARY.md

@@ -2037,9 +2037,9 @@ census of what `CALC.PAS` actually needs and the reference measurements from
 the original `TURBO.COM`. Two tracks run in parallel: the ladder (front-end,
 the original `TURBO.COM`. Two tracks run in parallel: the ladder (front-end,
 verifiable on small fixtures) and the layout (§3, the only thing that stops
 verifiable on small fixtures) and the layout (§3, the only thing that stops
 the compiler *emitting* a 16,560-byte program). The ratchet and front-end
 the compiler *emitting* a 16,560-byte program). The ratchet and front-end
-features through **write field widths** are landed: the ladder
+features through **WITH and n-dimensional subscripts** are landed: the ladder
 (`tests/calc_ladder.sh` + `tests/fixtures/calc_ladder.tsv`, run by `run_all.sh`;
 (`tests/calc_ladder.sh` + `tests/fixtures/calc_ladder.tsv`, run by `run_all.sh`;
-CALC.PAS now stops at `ERR 102` at pos 15026, `with Sheet[I,J]` in `DisplayP`), the `{$I}` include,
+CALC.PAS now stops at `ERR 102` at pos 15131, `CellStatus := [Txt]` in `Init`), the `{$I}` include,
 `^X`/`#nn`, scalar typed constants, sets, enums, records (CellRec = 80),
 `^X`/`#nn`, scalar typed constants, sets, enums, records (CellRec = 80),
 subranges, arrays, element/field access, file types, string value parameters,
 subranges, arrays, element/field access, file types, string value parameters,
 `Length`, the CRT identifiers (`ClrScr`/`GotoXY`/`ClrEol`/`LowVideo`/
 `Length`, the CRT identifiers (`ClrScr`/`GotoXY`/`ClrEol`/`LowVideo`/
@@ -2047,8 +2047,9 @@ subranges, arrays, element/field access, file types, string value parameters,
 (by reference; `t73_varparam`), comma-separated CASE labels and real CASE
 (by reference; `t73_varparam`), comma-separated CASE labels and real CASE
 ranges (`t74_caselist`), variable array subscripts scaled by the element size
 ranges (`t74_caselist`), variable array subscripts scaled by the element size
 (`t75_arrvar`), write field widths (`t76_width`, runtime entry 20 `wrintw`),
 (`t75_arrvar`), write field widths (`t76_width`, runtime entry 20 `wrintw`),
-and `INT 10h`+`C6` in Exec86 (fixtures through `t76_width`). The next rung is
-the 2-D subscript and `with`; then the remaining string
+WITH and n-dimensional subscripts (`t77_with`), and `INT 10h`+`C6` in Exec86
+(fixtures through `t77_with`). The next rung is the set/string assignment to
+a record field; then the remaining string
 builtins, file operations, variable-index subscripts + `with`, pointers, `var`
 builtins, file operations, variable-index subscripts + `with`, pointers, `var`
 params, reals, recursion, and the layout change. Items 1-4 below are
 params, reals, recursion, and the layout change. Items 1-4 below are
 independent of both.
 independent of both.