Repository navigation
Doc CHANGELOG
Copia di
CHANGELOG.md— torna a Documenti · Home
Le modifiche normative aggiornano anche VERSION, la specifica (SPEC.md) e, se cambia
il comportamento, i golden di conformance/.
Il seed riconosceva le parole chiave confrontando i byte grezzi del sorgente: un
identificatore che inizia con una keyword (iffy, myif) veniva scambiato per il
costrutto, e dentro un corpo di blocco il contatore di annidamento contava anche le
keyword contenute nel testo di un letterale ("if end else while"), spostando la fine
del blocco (exit 1).
-
fix (seed): helper
kw_bound(confine bilatero della parola chiave) e routinesc_string(salto del testo di un letterale) inseed/dev/core.js; -
contratto:
D22esce daseed/dev/certified-subset.txt; guardiaG-D22rimossa; la regolaE010del lint del sito è rimossa (un letterale può contenereifanche dentro un blocco); -
probe:
bad_if_in_blocco/bad_if_in_blocco_while→ok_if_in_blocco/ok_if_in_blocco_while; nuoviok_keyword_confineeok_keyword_inizio_sorgente(55 → 57 probe); -
artefatti: dump PE (25088 byte, codice 11996 byte) ed ELF (11977 byte) rigenerati,
hash CI aggiornati (PE
20aa566d…, ELF8457051f…).
Verifiche PASS: conformance 42/42, probe 57/57 (ELF e PE via wine), logica 29/29, guardie 23 test, differenziale 0 differenze, anti-drift e hash CI verdi. Nessun golden riscritto.
Il seed dichiarava exit disponibile senza implementarlo e non implementava gli altri
primitivi §8: senza readfile S1 non può nemmeno caricare il programma da interpretare.
-
seed:
strlen(s),strbyte(s, i),strsub(s, a, b)(byte, 1-based),readfile(path)(max 1 MiB, path max 1024 byte) eexit(n); -
fix (seed): un simbolo non è più una stringa (tipo 5):
strlen(:x)e"a" * :bfalliscono come sul riferimento JS; -
contratto:
D16esce dal contratto;[available]dichiara i quattro primitivi; nuovi limiti in[envelope](file.max_bytes,path.max_bytes); -
probe: 47 → 55 (
ok_readfile,ok_strlen,ok_strbyte,ok_strsub,ok_exite i casibad_*corrispondenti); -
artefatti: dump PE (25088 byte) ed ELF (11465 byte) rigenerati (PE
0432c4ca…, ELFa5fa3e50…).
Verifiche PASS: conformance 42/42, probe 55/55, logica 29/29, guardie 24 test, differenziale 0 differenze. Nessun golden riscritto.
Il seed rappresenta Int con 2 bit di tag (range utile [-2^61, 2^61−1]), mentre
SPEC-CORE.md §5 vuole interi a 64 bit signed con wrap: un valore fuori range veniva
prodotto sbagliato in silenzio. Ora il seed lo rifiuta (exit 1,
seed: integer overflow su stderr ELF) e la divergenza D25 diventa noisy. Decisione:
docs/adr/0003-range-interi-del-seed.md (i 64 bit restano un vincolo per S1).
-
fix (seed): controllo di range sui risultati aritmetici e sui letterali decimali
(
int_chk62inseed/dev/core.js); -
probe:
bad_intero_64bitda divergenza silenziosa a rifiuto; nuovibad_intero_overflow_add,bad_intero_overflow_mul,bad_intero_overflow_pow(44 → 47 probe).
Verifiche PASS: conformance 42/42, probe 47/47, logica 29/29, guardie 25 test.
Chiuso il ciclo core.js → dump PE/ELF → binari → hash CI → documentazione: il generatore
riproduce i dump committati byte per byte e il gate hash della CI è allineato.
-
fix (seed):
-=era sbagliato in silenzio (operandi invertiti nel codegen); -
contratto: chiuse
D6(-=,*=a nome),D9(chiamata in posizione finale) eD13(indicizzazionexs[i]1-based exs[i] = v); nuoveD24(noisy:xs[i] += vnon implementata) eD25(interi limitati); - probe: 39 → 44.
Verifiche PASS: conformance 42/42, probe 44/44, guardie 25 test, differenziale 0 differenze.
Prerelease con S1 logico, desktop automatico, fix Core/output e cleanup integrati fino alla
PR #84; versione e metadati allineati, note in docs/releases/RELEASE_NOTES_v0.8.0-beta.10.md;
nuovo workflow Release (build nativi Linux/Windows, CLI standalone, archivio sorgente,
SHA256SUMS).
Nuovo profilo triad --logic FILE (oppure - per stdin), scritto in Triad-Core in
selfhost/logic/engine.td: fatti/regole, unificazione iterativa con occurs-check,
backtracking con choice stack e trail, congiunzione/disgiunzione/negazione, liste e code,
solve come valore, proiezioni e comprensioni, predicati come Bool, limit/depth/steps.
Lo shell trasporta solo byte con od/printf: nessun interprete Node/Julia nel percorso
runtime.
Corretto un prerequisito reale del seed: dopo xs[i] = valore il cursore veniva
ripristinato all'inizio dello statement (loop infinito). Aggiunti in seguito trace,
struct, funzioni booleane e sorgenti paginati (fino a 65535 byte).
Validazione: suite logica 29/29 su seed e riferimento JS, Core 42/42, probe 57/57,
verify.sh PASS. Limiti espliciti in selfhost/logic/README.md.
-
E1: l'ELF esegue un file
.td(argv + I/O); - E2: l'ELF è un interprete Triad-Core (11977 byte) con parità byte-esatta col PE Windows: conformance 42/42 + probe 57/57 + golden S1, Linux nativo senza Wine;
-
E3: toolchain senza Node —
./install.sh(decodifica del seed conprintf, wrapper a percorso assoluto, smoke test byte-exatto che fallisce l'installazione su mismatch) →bin/triad+ CLI POSIXbin/triad-cli(run/test/status);cli/triad-cli.mjsridotta ai comandi dev (seed/ai/ext); -
CI: rimosse le gambe Windows (decisione 04), aggiunti i job
seed-linuxelinux-toolchainnativi, hash PE ed ELF con anti-driftcmpdei due dump.
Rimossa l'ultima esclusione liste: conformance/gate.sh delega all'oracle e propaga il
suo exit code; aggiornati verify.sh, il nome dello step CI, AGENTS.md e la
documentazione. Nessun golden, dump o generatore modificato. Riferimento normativo:
SPEC-CORE.md §11.
Un : seguito dall'inizio di un identificatore appartiene a un simbolo e non decrementa
la profondità dei ternari (SPEC.md §1, SPEC-CORE.md §§2, 4–6): D23 esce dal
contratto e l'esclusione ternario_simbolo dal gate.
process.exit() terminava il riferimento JS prima dello svuotamento di stdout su pipe:
il CLI ora imposta process.exitCode e lascia svuotare gli stream. Aggiunto il caso Core
output_pipe con golden deterministico.
Con KDE_SESSION_VERSION >= 5 e qtpaths assente, la sola chiamata xdg-mime default
usa il backend standard (X-Generic). Nessun runtime o golden modificato.
Parser delle firme, tabella metodi, ordine parziale di specificità, ridefinizione e
ritorni scalari; Err(:method) e Err(:ambiguous) per mancata selezione e ambiguità.
La suite logica passa a 29 casi su seed e riferimento.
Rimossi due script non richiamati, tre assegnazioni/allocazioni inutili di S1 e la guardia
D23 inattiva. Nessun golden o artefatto macchina modificato; evidenze in
docs/unused-code-audit.md.
-
Conformità: nuovo caso Core
gcd(Euclide, ricorsione e%); la suite Core ha 37 casi. -
Golden versionati:
.gitignorenon esclude piùconformance/**/expected.outeexpected.code; il runner accettaexpected.goldencome copia di riserva. -
Runner:
conformance/run.mjsusa l'interpreteseed/dev/triad_core.cjssu Linux/macOS (il seed ELF è ancora E0) e fallisce congolden mancanteinvece di confrontare con uno stdout vuoto; rimosso il goldengcdscritto nel codice del runner. -
Julia rimossa:
triad.jl,syntax.jl,test/ebin/build_standalone.jlnon fanno più parte del repository; la CI usa solo Node e il seed.
-
Open source: aggiunta
LICENSEMIT; inclusi nel repository i binari del seed (seed/windows-x86_64/seed.exe,seed/linux-x86_64/seed) e i lockfile (Manifest.toml,Cargo.lock);.gitignoree.gitattributesaggiornati.
-
Standard Triad v0.2.0:
SPEC.mddiventa un documento normativo indipendente dall'implementazione (stato, normatività, profili di conformità e versionamento in §16). -
Conformità eseguibile: aggiunta
conformance/con 12 casi golden (stdout + exit code) e un runner di sviluppo basato sullo stage0; la suite è parte dello standard. -
AI benchmark (strumento di sviluppo):
ai/con prompt di sistema, task Triad-Core eai verifyper generare codice con un LLM e verificarlo contro i golden. -
Seed Linux E0: primo ELF x86-64 statico, solo syscall (
write/exit). -
Estensione canonica:
.triad;.tdresta supportata come alias storico. -
Indipendenza: piano di bootstrap senza linguaggi ospiti in
BOOTSTRAP.md. -
Tooling editor: grammatiche di sintassi per VS Code e Vim/Neovim (
editors/) e preparazione della voce Linguist (editors/linguist/). - Seed M1/M2: primo eseguibile Triad in codice macchina (PE Windows x86-64), poi I/O reale dal primo argomento della command line.
-
Triad-Core: nuovo standard di profilo
SPEC-CORE.md(sottoinsieme normativo per il bootstrap self-hosted) e suiteconformance/core/. -
Seed M3b1…M3b2b3p: il seed in codice macchina interpreta Triad-Core — interi,
variabili, funzioni, confronti, ricorsione, blocchi
if/while, lambda, chiusure, stringhe,nothing, simboli,begin … end, frame lessicali, operatori!/&&/||/+=.
- Kernel S-expression
legacy/triad_sexpr_v1.jl(storico).
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