A script is given words, and keeps them
"do build.sh cosmos.asm" looked for a file called "build.sh cosmos.asm", because scriptOpen copied the whole rest of the line into the name. So a script could be told nothing, and a launcher - a script whose entire job is to hand on what it was told - could not exist. Now the name is cut off the front and what follows is kept whole. $1 to $9 are the words of it, walked out on demand, and $args is all of them. Nothing is stored per parameter, so there is no limit on how many a script may be handed and no second number to keep in step. Both ways of starting a script pass them on: "do" and typing the name. A word that was not given is an error that stops the script, like every other name this shell does not know. Expanding it to nothing would let a command run with an argument missing and then report success, which is what stop-on-failure exists to prevent. $args is always set inside a script, empty if it was given nothing, so "if same $args" can be asked. ---- And the count that describes the block was already wrong ---- Found while adding a field to it. The state one script keeps for another is saved by a single copy of a fixed number of bytes, and that number was 71 against a block of 77: six bytes of line position had been added in the middle of it years after the count was written. So the tail of every saved script was never saved, and #quiet in a helper stayed behind in the script that called it - the opposite of what this file's own comment promises and the README documents. The unsaved line position turned out not to matter, because a loop keeps its own copy in the block record. Nothing said so. Three numbers describe this block and all three now say so in a comment, and cosmosScriptNest ends on a helper that goes quiet and a caller that must not stay that way. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01E2JrLzFvuFX9fgi1LDRjrW
This commit is contained in:
co-authored by
Claude Opus 5
parent
06af7e7fbb
commit
d9ebc76cf5
@@ -983,7 +983,23 @@ cosmosScriptEdges | CosmOS/Source/cosmos.asm | run | cosmosScr
|
||||
# into the single buffer, so coming back means reading the outer one's again and landing on
|
||||
# the byte it left. Then a script that runs itself, which stops at four deep and takes every
|
||||
# level with it, because a build whose helper failed should not carry on in its caller.
|
||||
# It also ends on the state a nested script gives back. The saved block is copied by a fixed
|
||||
# count, that count was six bytes short of the block, and quiet was in the six - so a helper
|
||||
# that went quiet left its caller quiet. "echo aloud again" being ECHOED is the check.
|
||||
cosmosScriptNest | CosmOS/Source/cosmos.asm | run | cosmosScriptNest.in | 200000000 | disks/cosmos.img
|
||||
# ---- What a script is given ----
|
||||
#
|
||||
# $1 to $9 are the words it was handed and $args is all of them. Nothing is stored per
|
||||
# parameter: the line is kept whole and the word wanted is walked out of it.
|
||||
#
|
||||
# Five claims in one session. Both ways of starting a script pass words on - "do" and typing
|
||||
# the name. A LAUNCHER can hand on what it was told without knowing what any of it means,
|
||||
# which is the reason this rung is on the ladder at all. A nested script gets its own words
|
||||
# and the caller still has its own afterwards. And a word that was not given is an ERROR that
|
||||
# stops the script, like every other name the shell does not know - not silently nothing,
|
||||
# which would let a command run with an argument missing. At the prompt they are ordinary
|
||||
# unset names, because there is no script to have been given anything.
|
||||
cosmosScriptArgs | CosmOS/Source/cosmos.asm | run | cosmosScriptArgs.in | 200000000 | disks/cosmos.img
|
||||
# ---- Starting itself ----
|
||||
#
|
||||
# /System/Boot/startup.sh runs before anybody can type. This one is also the check on #quiet
|
||||
|
||||
Reference in New Issue
Block a user