Tricks für das Compilieren zur Laufzeit

03/05/2016 - 01:16 von djc | Report spam
Hallo,

ok, alle wissen es: Forth kann zur Laufzeit compilieren...

Moment mal - stimmt das denn?

Nehmen wir mal an, ich möchte folgendes Programm zur Laufzeit "erzeugen" - ohne EVALUATE und ohne include/require:

-
123 constant GS_UFFA
variable Fuellstand

: Initialisieren gs_uffa Fuellstand ! ;
-

Zumindest für gForth gibt es mit nextname die Möglichkeit, einen String als Argument für das nàchste CREATE festzulegen.

Mit compile, postpone, literal und , (genau, nach und soll man kein Komma setzen) kann mann ja eigentlich alles compilieren, was man braucht.

Aber - geht das auch für create-does? Für Forth-Datenstrukturen?

Viel Spaß beim Ràtseln :-)
Daniel
 

Lesen sie die antworten

#1 Bernd Paysan
13/05/2016 - 13:24 | Warnen spam
Am Mon, 02 May 2016 16:16:52 -0700 schrieb djc:

Zumindest für gForth gibt es mit nextname die Möglichkeit, einen String
als Argument für das nàchste CREATE festzulegen.



Und mit EXECUTE-PARSING gibt es einen Vorschlag, der das Konzept
verallgemeinert. Das kann man sogar portabel implementieren (mit
EVALUATE):

get-current execute-parsing-wordlist set-current

\ X is prepended to the string, then the string is EVALUATEd
: X ( xt -- )
previous execute
source >in ! drop ; immediate \ skip remaining input

set-current

: >order ( wid -- )
r get-order 1+ r> swap set-order ;



: execute-parsing ( ... c-addr u xt -- ... )
r dup >r


dup 2 chars + allocate throw >r \ construct the string to be
EVALUATEd
s" X " r@ swap chars move
r@ 2 chars + swap chars move
r> r> 2 + r> rot dup >r rot ( xt c-addr1 u1 r: c-addr1 )
execute-parsing-wordlist >order \ make sure the right X is executed
['] evaluate catch \ now EVALUATE the string
r> free throw throw ; \ cleanup

Bernd Paysan
"If you want it done right, you have to do it yourself"
net2o ID: kQusJzA;7*?t=}1GWr!+0qqp_Cn176t4(dQ*
http://bernd-paysan.de/

Ähnliche fragen