egy kis slc változtatás itt-ott
This commit is contained in:
parent
81890e9aa3
commit
37872eb496
106
BASED.md
106
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.:
|
||||
|
Loading…
x
Reference in New Issue
Block a user