Repository navigation
Doc STATUS
Aggiornato al 2026-11-09 (ciclo D22, release 0.8.0-beta.10).
Triad come linguaggio autonomo e riconosciuto: standard proprio, conformance, estensione .triad, tooling editor, bootstrap senza linguaggi ospiti e self-hosting.
-
Standard:
SPEC.md(v0.2.0),SPEC-CORE.md,VERSION(0.8.0-beta.10),CHANGELOG.md. -
Conformance: harness POSIX
conformance/run.sh(senza Node, senza Julia); Triad-Core 42/42 verde e byte-exatto sul seed ELF nativo (seed/linux-x86_64/seed, niente Wine); gateconformance/gate.shsenza esclusioni. Triad-Full: 12 casi, oggi passa soloerrore(fuori dal gate). Goldenexpected.out/expected.codeversionati; un golden mancante fa fallire il caso congolden mancante. -
Estensione canonica:
.triad(.tdalias storico), grammatiche VS Code/Vim e voce Linguist preparata. -
Seed S0 (codice macchina, nessun runtime/compilatore): interprete Triad-Core in due
artefatti con parità byte-esatta — PE Windows (25088 byte, codice 11996 byte, dump
20aa566d…83d7b7) ed ELF Linux (11977 byte, dump8457051f…315d613); coprono interi, variabili, funzioni (forma breve efunction … end), ricorsione, Bool, operatori (% ^ ! && || += -=),if/elseif/else,while,let,begin, lambda, chiusure, stringhe,nothing, simboli, liste di interi (xs[i]1-based,xs[i] = v,push!) e i primitivi §8get,exit,readfile,strlen,strbyte,strsub. -
Contratto del seed:
seed/dev/certified-subset.txt(leggibile dalla macchina) elenca envelope, primitivi e divergenze D1–D25 dal comportamento diSPEC-CORE.md(classesilent= risultato sbagliato senza errore,noisy= exit 1); le guardie statiche (tools/selfhost-guard/) e il gate differenziale seed↔JS consumano il contratto e si spengono da sole quando una divergenza viene risolta. -
S1 (Triad in Triad-Core): front-end in
selfhost/(scanner + parser ricorsivo discendente, AST in pre-order) e motore logico eseguibile inselfhost/logic/engine.td(triad --logic FILE): fatti/regole, unificazione con occurs-check, backtracking, congiunzione/disgiunzione/negazione, proiezioni e comprensioni,solvecome valore,trace,structe funzioni booleane — 29/29 casi logici su seed e riferimento. -
Launcher/CLI: il runtime predefinito per
.triadè il seed in codice macchina (bin/triad,bin/triad.cmd);bin/triad-cliè la CLI POSIX senza Node (run/test/status);cli/triad-cli.mjsresta la CLI Node dei soli comandi dev (seed/ai/ext). L'implementazione Julia è stata rimossa dal repository. -
CI:
.github/workflows/ci.yml— solo runner Linux nativi (decisione 04): jobconformance-core,logic-engine,security,site-gen,seed-linux(hash PE ed ELF + anti-driftcmpdei due dump +check_seed.sh) elinux-toolchain(installazione senza root, smoke test byte-exatto, caso negativo). -
Sito e libro: il sito statico in
docs/è generato da programmi Triad (tools/site-gen/, 13 file generati, lintE010rimosso con D22); il libro (docs/libro/) è costruito dalle sorgenti Italiane (PDF/EPUB/DOCX).
| area | stato |
|---|---|
stringhe (string()) |
✅ implementato per Int/String; Bool/Symbol/Nothing assenti |
liste |
✅ caso Core verde sul seed: costruzione, stampa, xs[i] 1-based, xs[i] = v, push!; length e iterazione non supportate |
valori (liste/simboli/stringhe insieme) |
parziale; liste solo intere, senza operazioni o valori misti |
controllo (elseif) |
✅ implementato |
continue |
assente dal seed (exit 1): divergenza D5
|
-=, *= a nome |
✅ risolti (D6 chiusa); resta xs[i] += v (divergenza D24, noisy) |
while-espressione (x = while … end) |
assente dal seed (exit 1): divergenza D7
|
if come valore |
solo in coda al corpo di una funzione: divergenza D8
|
corpo di if/while
|
il seed non crea un ambiente proprio: divergenza D20
|
condizione while non-Bool
|
il seed salta il corpo in silenzio: divergenza D21
|
interi a 64 bit con wrap (SPEC-CORE.md §5) |
il seed ha 2 bit di tag: range utile [-2^61, 2^61−1]; fuori range rifiutato (exit 1), non prodotto sbagliato in silenzio — divergenza D25, decisione docs/adr/0003-range-interi-del-seed.md
|
| S1 (Triad in Triad-Core) | in corso in selfhost/: front-end e motore logico eseguibili, non ancora conformance completa |
| Triad-Full | 11/12 casi non implementati (passa solo errore) |
| CLI seed | solo esecuzione di file; REPL e opzioni di SPEC §14 da fare |
| S2–S3 (compilatore nativo, self-hosting) | non iniziati |
sh verify.sh # gate unico: conformance + probe + logica
sh conformance/run.sh # Core, 42 casi, byte-exatti sull'ELF nativo
sh tests/probes/run_probes.sh # 57 probe (ok_*/bad_* + golden S1)
sh conformance/logic/run.sh # 29 casi logici (S1)
sh seed/linux-x86_64/check_seed.sh # errori/limiti del seed (7 casi)
node tools/selfhost-guard/guard.mjs # guardie statiche sul corpus certificato
node tools/selfhost-guard/test.mjs # self-test delle guardie
node tools/selfhost-guard/differential.mjs # gate differenziale seed <-> riferimento JSWindows, seed (PE invariato, non rieseguito dal gate — ADR 0002):
certutil -decodehex -f seed/windows-x86_64/seed.hex seed/windows-x86_64/seed.exe
.\seed\windows-x86_64\seed.exe conformance\core\cases\closure\program.tdSviluppo su Linux/macOS: scripts/seed-runner/seed-wine.sh FILE.td esegue il PE sotto wine
(cache in ~/.cache/triad2.0/seed-wine); è uno strumento di sviluppo, fuori dalla catena
S0→S4.
-
LICENSEaggiunta (MIT, 2026-10-22); - PR a GitHub Linguist con
editors/linguist/languages.yml; - pubblicazione delle estensioni VS Code / Open VSX e Vim;
- eventuale registrazione del linguaggio/standard.
-
E1 → E2 → E3 (port Linux, 2026-11-05): runner di un file
.td→ ELF interprete Triad-Core (parità byte-exatta col PE) → toolchain senza Node (./install.sh→bin/triad/bin/triad-cli, CIseed-linuxnativa). Windows mantiene il PE invariato. -
Motore logico S1 (2026-11-08):
triad --logic FILEsuselfhost/logic/engine.td, 29/29 casi logici su seed e riferimento; profilo:logic/:coreespliciti nella sessione desktop. -
D25 (2026-11-08): l'overflow degli interi del seed è un errore (exit 1,
seed: integer overflow), non un numero sbagliato in silenzio. -
D16 (2026-11-08): i primitivi §8
readfile,strlen,strbyte,strsubsono nel seed; un simbolo non è più una stringa. -
D22 (2026-11-09): le parole chiave sono token esatti (
iffy,myif,endx,elsewheresono identificatori) e il testo di un letterale non conta per l'annidamento dei blocchi.
Parte prima
Parte seconda 4. Le parole del linguaggio 5. Valori e tipi 6. Espressioni, operatori e variabili 7. Decidere e ripetere 8. Funzioni e ricorsione 9. Lambda, chiusure e visibilità dei nomi 10. Liste e dati strutturati 11. Stringhe, simboli e byte 12. Quando le cose vanno storte 13. Progetto: un piccolo interprete
Parte terza 14. Tipi, struct e multiple dispatch 15. Programmazione logica 16. Codice come dato e macro 17. Garanzie, costrutti Full e interfaccia
Parte quarta 18. Anatomia del progetto e contratto di conformità 19. L'interprete di riferimento 20. Il seed in codice macchina 21. Verso il self-hosting 22. Gli strumenti di sviluppo
Appendici
- Riferimento dei builtin Core
- Catalogo conformance Core
- Catalogo conformance Full
- Sorgenti degli esempi
- Sorgenti self-hosted
- Documenti di riferimento
- Indice analitico
Manuale di consultazione