Re-scope the remaining language queue against what the work turned up

Group A is blocked on block skipping that works by statement rather than by
source line, and RESTORE is blocked on a DATA pointer that does not exist --
which is a live defect rather than only a missing verb. Both were found while
doing other work and neither is skippable by the group that needs it.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-07-31 12:10:03 -04:00
parent b5974121af
commit 46a0693c5f

33
TODO.md
View File

@@ -1125,18 +1125,29 @@ What remains, in priority order:
2. ~~**A line editor for the akgl sink.**~~ **Done**`readline` in `src/sink_akgl.c`, over
the keystroke ring, borrowing frames from the host through an `akbasic_AkglPump`. It cannot
type a shifted character, which is `libakgl` item 10 rather than work outstanding here.
3. **§4 — the language completion work queue.** Groups G and I, the `GET`/`GETKEY`/`SCNCLR`
part of E, and **multiple statements per line** are done. What is left is groups A, B, D, F
and J, none of which need anything from `libakgl`.
3. **§4 — the language completion work queue**, and it is the only substantial thing left.
Done: groups G and I, the `GET`/`GETKEY`/`SCNCLR` part of E, group B, multiple statements
per line, and array references in parameter lists. Left: groups A, D, F and J, plus
`RESTORE` and `RENUMBER` out of B and the sprite group H. None needs anything from
`libakgl` except H.
**Do group A next, and expect it to cost more than the table suggests.** Multiple statements
per line turned up the wall it will hit: the `waitingForCommand` model skips forward *by
source line*, so a whole loop written on one line
(`FOR I# = 1 TO 3 : PRINT I# : NEXT I#`) never reaches its `NEXT`. §4 records it as a known
limitation rather than a defect, because it is inherited structure and not a slip — but
`DO`/`LOOP`/`WHILE`/`UNTIL` are exactly the verbs people write on one line, so group A
probably has to move block skipping from lines to statements before it starts. That is a
deliberate restructure and wants its own commit and its own test, ahead of any verb.
**Two pieces of structural work come before the verbs, and both were found rather than
guessed.** Neither is a verb and neither can be skipped by the group that needs it:
- **Block skipping works by source line, and group A needs it to work by statement.**
`waitingForCommand` skips forward to a verb one *line* at a time, so a whole loop written
on one line — `FOR I# = 1 TO 3 : PRINT I# : NEXT I#` — never reaches its `NEXT`. That is
inherited structure rather than a slip, and it did not matter until a line could hold more
than one statement. `DO`/`LOOP`/`WHILE`/`UNTIL` are exactly the verbs people write on one
line, so group A starts here or it ships something that does not work.
- **`READ` has no DATA pointer, and `RESTORE` is the verb that needs one.** §4 has the
detail; the short version is that `READ` skips forward to the next `DATA` *reached in
execution order*, so a `DATA` line placed before its `READ` is never found at all and a
second `READ` re-reads the same line. It is a live defect, not only a blocked verb.
Ordering suggestion, unchanged in spirit from the original: A (after the restructure), then
D and J, which are self-contained, then F, which is 21 verbs of `aksl_f*` and mostly
mechanical. H needs a look at `libakgl`'s sprite and actor API before anything is filed.
4. ~~**CI does not cover `-DAKBASIC_WITH_AKGL=ON`.**~~ **Done** — the `akgl_build` job in
`.gitea/workflows/ci.yaml`. It turned out much cheaper than the deferral assumed, and the
two reasons are worth keeping because both were guesses that measurement corrected: