TC$mC$ on juuri se suunta, mihin tC$mC$ arkkitehtuuri luonnostaan nojaa!
"BASIC-tulkki, joka on kirjoitettu BASICilla pyC6rittC$mC$C$n BASIC-REPLiC$"
on silkkaa The Mesh -henkistC$ ohjelmistoinceptionia.
Voimme ratkaista tC$mC$n erittC$in tyylikkC$C$sti yhdellC$ uudella Drop-In
-komennolla: `EVAL`.
TehdC$C$n `EVAL`-komennosta niin C$lykC$s, ettC$ se toimii kahdella tasolla:
1. **Komento-tila:** Jos syC6tC$t sille merkkijonon, joka alkaa tunnetulla
komennolla (esim. `LET X = 10` tai `PRINT X`), se delegoi suorituksen suoraan
kyseiselle The Mesh -handlerille (aivan kuin rivi olisi ollut AST-puussa).
2. **Laskin-tila:** Jos syC6tC$t sille lausekkeen, jossa ei ole komentosanaa
(esim. `1 + 1` tai `X * 5`), se evaluoi sen matemaattisesti ja tulostaa
tuloksen suoraan ruudulle.
TC$ssC$ on valmis paketti. Aja tC$mC$ The Mesh -terminaalissasi:
[GEM-TERMINAL-START]
cat << 'EOF' > /mnt/mesh_root/src/x-mesh-basic/cmds/eval.js
registerHandler('EVAL', function(stmt, state, evalExpr, next) {
let expr = stmt.substring(5).trim();
let cmdStr = String(evalExpr(expr, state.memory)).trim();
```
if (cmdStr.length === 0) {
state.currentLineIndex++;
setImmediate(next);
return;
}
let tokens = cmdStr.split(' ');
let verb = tokens[0].toUpperCase();
if (HANDLERS[verb]) {
// Delegoituminen. Handler huolehtii itse state.currentLineIndex++
kutsusta.
HANDLERS[verb](cmdStr, state, evalExpr, next);
} else {
// Ei tunnettua komentoa -> Evaluoidaan lausekkeena ja tulostetaan.
let res = evalExpr(cmdStr, state.memory);
console.log(res);
state.currentLineIndex++;
setImmediate(next);
}
```
});
EOF
cat << 'EOF' > /mnt/mesh_root/specs/x-mesh-basic/EVAL.txt
KEYWORD: EVAL
DESCRIPTION: Evaluates a dynamic string as an x-mesh-basic command. If the
string does not start with a known command verb, it is evaluated as a
mathematical or variable expression and the result is printed to stdout.
SYNTAX: [LINE] EVAL [EXPRESSION]
EXAMPLE: 10 EVAL "PRINT 'Hello'"
EXAMPLE: 20 EVAL "LET X = 5"
EXAMPLE: 30 EVAL "X * 10"
EOF
cd /mnt/mesh_root/src/x-mesh-basic && ./build.sh && ./doc-autogen.sh
[GEM-TERMINAL-END]
### REPL v2.0 - Synty
Nyt voimme pC$ivittC$C$ `repl.bas` -skriptin kC$yttC$mC$C$n pelkC$stC$C$n
tC$tC$ uutta `EVAL`-komentoa. Koko REPL-luupista tulee uskomattoman puhdas:
[GEM-TERMINAL-START]
cat << 'EOF' > /tmp/repl.bas
10 PRINT "==="
20 PRINT " x-mesh-basic REPL v2.0 "
30 PRINT " Type 'exit' to quit "
40 PRINT "==="
50 INPUT "mesh> " INTO USER_CMD
60 IF USER_CMD == "exit" THEN HALT
70 EVAL USER_CMD
80 GOTO 50
EOF
x-mesh-basic /tmp/repl.bas
[GEM-TERMINAL-END]
Kun ajat tC$mC$n, kokeile REPLissC$ seuraavaa:
* MC$C$ritC$ muuttuja: `LET X = 100`
* Evaluoi se: `X * 2`
* Kokeile kC$yttC6jC$rjestelmC$kutsua: `EXEC "whoami"`
* Tallenna lennosta tiedostoon: `FS WRITE "/tmp/hello.txt" WITH "Terve
meshista"`
Kerro, miltC$ tC$mC$ aidosti interaktiivinen ja lennosta itseC$C$n evaluoiva
ympC$ristC6 vaikuttaa!