Stop the listings and their chapters stating fixed defects as fact
Some checks failed
akbasic CI Build / cmake_build (push) Failing after 3m21s
akbasic CI Build / sanitizers (push) Failing after 4m30s
akbasic CI Build / coverage (push) Failing after 3m40s
akbasic CI Build / akgl_build (push) Failing after 21s
akbasic CI Build / mutation_test (push) Failing after 3m27s
Some checks failed
akbasic CI Build / cmake_build (push) Failing after 3m21s
akbasic CI Build / sanitizers (push) Failing after 4m30s
akbasic CI Build / coverage (push) Failing after 3m40s
akbasic CI Build / akgl_build (push) Failing after 21s
akbasic CI Build / mutation_test (push) Failing after 3m27s
You were right that this was still everywhere. The two `.bas` files carried their workarounds as present-tense statements about the interpreter -- "a name first created inside a GOSUB costs a value slot that is never handed back", "writing PAST the terminator of a short row draws nothing at all", "SSHAPE and GSHAPE ignore the subscript on a string array", "a FOR inside a BEGIN block does not survive the RETURN" -- and every one of those is now false. A comment that lies is worse than no comment, and these were the first thing anybody opening the files would read. **The characters game takes the geometry fix.** `CW# = 16` becomes `CW# = RGR(3)`, and the grid comes from `RWINDOW`, so the game fits whatever window and font the host gives it. That was the one thing in the listing that would break on a different font, and `RGR(3)` and `RWINDOW` were added to the interpreter because of it -- leaving the constant in place while Chapter 17 teaches the function was the inconsistency worth closing. `RGR(1)` still comes first so a build with no graphics device refuses by naming the device that is missing. Everything else in both listings keeps its shape and says why. Declaring every name up front, guarding loops with `GOTO`, six scalars for six brick stamps: none is forced any more and none costs anything, so they stay, with the comments marking which rules stand and which are history. The sprites header's five traps are marked FIXED where they are fixed. The chapters follow: Chapter 17 Step 2 no longer says "the listing still has `CW# = 16`", and Chapter 18's trap section is "five things that did not do what they looked like" with the two that still stand named up front rather than left to be counted. Verified: Chapter 17 Step 2's block is once again verbatim from the listing, so every quoted fragment in both chapters matches its source with no exceptions; both games run 40 seconds on the SDL frontend with no error line; both suites green in both configurations; `docs_examples` and `docs_screenshots --check` pass. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -54,10 +54,10 @@ with it. That is Chapter 18.
|
||||
## Step 2: Measure the screen once, at the top
|
||||
|
||||
```basic norun
|
||||
CW# = RGR(3)
|
||||
CH# = RGR(4)
|
||||
SCW# = RGR(1)
|
||||
SCH# = RGR(2)
|
||||
CW# = RGR(3)
|
||||
CH# = RGR(4)
|
||||
COLS# = RWINDOW(1)
|
||||
ROWS# = RWINDOW(0)
|
||||
```
|
||||
@@ -68,10 +68,14 @@ columns and rows — see [Chapter 6](06-graphics.md#rgr). Everything below is de
|
||||
these, including the ball's speed relative to the wall, so the game fits whatever window
|
||||
the host opened and whatever font it loaded.
|
||||
|
||||
**The listing in `examples/` still has `CW# = 16` written out**, measured by hand against
|
||||
the bundled C64_Pro_Mono at 16 points, because when it was written a program had no way
|
||||
to ask — and it was the one thing in it that would break on a different font. That is
|
||||
what `RGR(3)` and `RWINDOW` are for; `TODO.md` §6 item 31 is the history.
|
||||
**The first version of this file had `CW# = 16` written out**, measured by hand against
|
||||
the bundled C64_Pro_Mono at 16 points, because there was no way to ask — and it was the
|
||||
one thing in the listing that would break on a different font. `RGR(3)` and `RWINDOW`
|
||||
were added to the interpreter because of it; `TODO.md` §6 item 31 is the history.
|
||||
|
||||
The order matters only for the error you get without a graphics device: `RGR(1)` refuses
|
||||
first, naming the device that is missing, which is what should stop a game that cannot
|
||||
draw.
|
||||
|
||||
Lay the rest of the geometry out in the same block — the wall in cells, the play area in
|
||||
pixels:
|
||||
|
||||
@@ -623,14 +623,15 @@ RETURN
|
||||
|
||||
A silenced voice costs nothing to issue. One line beats eleven scattered through the game.
|
||||
|
||||
## Five things in this dialect that do not do what they look like
|
||||
## Five things that did not do what they looked like
|
||||
|
||||
Each of these cost an evening, and each was filed in `TODO.md` §9 with a reduction and
|
||||
the file and line of the cause. **Three of the five have since been fixed**, and are kept
|
||||
here as the history of why this program is shaped the way it is — a listing whose
|
||||
comments explain what it was avoiding is worth more than one quietly rewritten to pretend
|
||||
the problem never existed. The two that remain are the first and the last, and the first
|
||||
is the dangerous one.
|
||||
Each cost an evening, and each was filed in `TODO.md` §9 with a reduction and the file
|
||||
and line of the cause. **Three of the five have since been fixed** — the interpreter
|
||||
changed, not the game — and they are kept here because the shape of the program is still
|
||||
theirs: a listing whose comments explain what it was avoiding is worth more than one
|
||||
quietly rewritten to pretend the problem never existed.
|
||||
|
||||
**Two still stand, and they are the first two.** Read those; the rest is history.
|
||||
|
||||
### 1. The left operand decides integer or float arithmetic
|
||||
|
||||
|
||||
Reference in New Issue
Block a user