From 37872eb496d11d47dd19ab644eab2676f836dda6 Mon Sep 17 00:00:00 2001 From: Richard Thier Date: Fri, 13 Sep 2024 18:03:41 +0200 Subject: [PATCH] =?UTF-8?q?egy=20kis=20slc=20v=C3=A1ltoztat=C3=A1s=20itt-o?= =?UTF-8?q?tt?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- BASED.md | 106 ++++++++++++++++++++++++++++++++----------------------- 1 file changed, 62 insertions(+), 44 deletions(-) diff --git a/BASED.md b/BASED.md index 237b716..2831191 100644 --- a/BASED.md +++ b/BASED.md @@ -1325,27 +1325,27 @@ Ezt valahogy talán jó lenne támogatni, de lehet hogy felesleges. Ezzel nem cs hanem jelenleg ahol tart a végrehajtás, azt a programszöveget tudnánk módosítani. A fordításhoz szerintem ez nem kifejezetten ad plusz funkcionalitást, de az interpreterként működéshez viszont igen... +FONTOS: Itt (state-machine) a body-ban nem lehet #insert-esen deklarált szó, mert + Ennek megfelelően valami hasonló lehetne: - #: DECLARE_MIN_MAX_INT - #inserts { - #: MIN_INT // HIBÁS: Ezt nem lehet, insertálni deklarációt nem fog menni... - #IF(#LT) { - #DROP - } [ - #SWAP - #DROP - ] - # - #: MAX_INT // HIBÁS: Ezt nem lehet, insertálni deklarációt nem fog menni... - #IF(#GT) { - #DROP - } [ - #SWAP - #DROP - ] - # - } + #inserts: DECLARE_MIN_MAX_INT + #: MIN_INT // HIBÁS: Ezt nem lehet, insertálni deklarációt nem fog menni... + #IF(#LT) { + #DROP + } [ + #SWAP + #DROP + ] + # + #: MAX_INT // HIBÁS: Ezt nem lehet, insertálni deklarációt nem fog menni... + #IF(#GT) { + #DROP + } [ + #SWAP + #DROP + ] + # # Megj.: @@ -1359,25 +1359,16 @@ nyers programszöveg - itt az olvasó fej már ugyebár beolvasta a `DECLARE_MIN és olyan eredményt kapunk, mintha az adott dolgokat titkon oda gépelte volna valaki, szóval amint kész ezen szó futtatása, a rendszer a #: deklarációs szót fogja az inputján látni. Ezzel az input kiegészítésre került! -A #inserts-hez tartozhatnak paraméterek: +A #inserts-hez jó lenne, ha tartozhatnának paraméterek: 42 21 #inserts (N K) { #push($N) #writechar #push($K) #push(2) #imul #writechar } Természetesen ez sokkal érdekesebb, ha nem így magában áll, hanem szó deklarációban, de a lényeg, hogy a zárójelek között felsorolhatok dolgokat, ami a stack-ről értéket kap. A $$ a $ escape-elése csupán... -Természetesen itt kellhet típust adni: +Talán itt kellhet típust adni: - 'some text word' 21 #inserts (word(W) float(F)) { .... } - -Az inserts továbbá rendelkezhet output átirányítós paraméterrel: - - #inserts [0] { ... } - -^^Ez például a 0.-dik kimenetre / pipe-ra ír, szerintem erre külön kéne saját szó: - - #outputs { ... } - 42 21 #errors (N K) { ... } + 'some_text_word' 21 #inserts (word(W) float(F)) { .... } Az insert-hez szükséges: @@ -1514,7 +1505,7 @@ Ebből legyen - útána meg már elvileg nem olyan nehéz: EXITWHEN(a == 42) } -## A makró nyelven a FORTH-szerű szavaknak változói / adattagjai is lehetnek (nem csak kódja)! +## VÁLTOZÓK: A makró nyelven a FORTH-szerű szavaknak változói / adattagjai is lehetnek (nem csak kódja)! - a szóhoz tartozó olvasása a stack-re tehát csak a neve, illetve a kukacos neve - írása meg a zárójelbe tett dolgot írja bele - kivéve hogy ha ott "pont" áll akkor a stack tetejét írja bele és csőváz @@ -1695,18 +1686,45 @@ Megj.: Bár van fájl kezelés, de szerintem alapvetően inkább a pass leíró Talán valami ilyesmi: - #passes(pass1 #both(pass2a pass2b) pass3 pass4) { - #pipe(pass1[0] pass2a[0]) - #pipe(pass1[1] pass2b[0]) - #pipe(pass2a[0] pass3[0]) - #pipe(pass3[0] pass4[0]) - #pipe(pass2b[0] pass4[0]) - } + #passes(pass1 #both(#both(pass2a pass2b) pass3) pass4) { + // Default legyen stdout->stdin pipe? Az egymás utáni pass-ok közt szerintem - amúgy manuálisan írható így le: + #pipe(pass1[stdout] pass2a[stdin]) + #pipe(pass1[stderr] pass2b[stdin]) + #pipe(pass2a[stdout] pass3[stdin]) + #pipe(pass3[stdout] pass4[stdin]) + #pipe(pass2b[stdout] pass4[stdin]) + } // stdin, stdout és stderr mellett ott szerepelhet "név" is! Ebben lehet "kiterjesztés" is, tehát fájlra / pipe-ra fordul! + // A pipe sorrend majdnem mindegy, de "törekedjünk" a "jó" sorrendre, mert nem hash, hanem tömb keresős ábrázolás lesz? Ezzel a megadott lépéseket futtatjuk az input fájlon úgy, hogy az adott standard output/error (és egyéb max 8) kimeneteiket a pipe-ok segítségével gráfosan kötjük össze. Természetesen csak DAG lehet az a gráf, különben sose fog lefutni a történet majd - erre gondolom nem árt majd valami check is. +Alternatíva(jobban tetszik): + + #passes( + lexer + stop_if_error(stdout){} + parse_blocks{imports.tmp types.tmp vars.tmp funcs.tmp components.tmp} + handle_imports(imports.tmp){names.tmp} + handle_types(types.tmp) + handle_vars(vars.tmp){names.tmp} + #parallel( + handle_names(names.tmp){names_bytecodes.tmp} + handle_funcs(funcs.tmp){funcs_bytecodes.tmp} + handle_components(components.tmp){component_bytecodes.tmp} + ) + write_asm(names_bytecodes.tmp funcs_bytecodes.tmp component_bytecodes.tmp){out.asm} + assemble() + ) + +Mit jelent ez? + +* A pass inputja (..) közötti, az outputja {..}. A neve egy "szó" (ami már "fentebb" definiált kell legyen, vagy include-olt) +* Ez a szó független stack-ekkel fut: Vagy van nekik sajátjuk (valódi párhuzamosság), vagy szekvenciális és törlődik a stack... +* + + Ez igazából "meta-nyelvi elem" is lett így, hiszen a pass-ok és a both esetén is a paraméterek másolatokat fognak csak kapni a stack-jeikből és azok "párhuzamosan" futnak, amennyiben ez lehetséges. Ha nem lehet, akkor természetesen sorban futnak le, balról-jobbra kiértékeléssel. Mindazt amit művelnek a kimeneteiken, egymásba @@ -1753,10 +1771,10 @@ Flag-ek: 1. offset_top 2. offset_top 3. offset_top - 4. offset_top - 5. offset_top + 4. DEF_TYPE0: definíciós típus első bitje + 5. DEF_TYPE1: 00: reguláris szó, 01: insertálóként definiált szó 6. TYPE0: a típus első bitje - 7. TYPE1: a típus második bitje (00 - szöveg és futtatatlan, 01 - szöveg és futtatott, 11 - THREADED és futtatott + 7. TYPE1: a típus második bitje (00 - szöveg és futtatatlan, 01 - szöveg és futtatott, 10 - THREADED, 11 - internal (C ptr) EDIT: @@ -1813,10 +1831,10 @@ Szerintem ezeket inline-olható, function pointerré kéne "elkódolnom", akár * Engine kódja * Callstack - előre adott méret (pl. parancssori paraméter, vagy embeddednél beállított) -* Insert-stack - az input "nyelének" kiegészítésére egy char elemekből álló stack * Adatstack, a műveleteivel - előre adott méret (pl. parancssori paraméter, vagy embeddednél beállított) -* Szimbólumtáblára MAP adatstruktúra (pl. kismap - név alapú lookupra + változó tároláshoz is [key alapján tudható melyik!]) +* Insert-stack - az input "nyelének" kiegészítésére egy char elemekből álló stack * Session storage - egy charakter vektorhoz hasonló, de csak állandóan növő storage + session reset rá. +* Szimbólumtáblára MAP adatstruktúra (pl. kismap - név alapú lookupra + változó tároláshoz is [key alapján tudható melyik!]) * IO accessor (fájlműveletek, pipe-ok stb.) Megj.: