204b
<< <> >>

2. Der Compiler

Wenn Sie eine Definition konstruiert haben, die
aaa IF bbb THEN ccc
enthält, und wenn Sie das dann decompilieren, dann werden Sie etwas in der Art von
aaa, JOF adr, bbb, ccc
zu sehen bekommen. IF ist zu JOF (jump on false) geworden, auf was dann eine (relative) Adresse folgt. THEN ist verschwunden. Logisch, denn die Adresse verweist, sehr wahrscheinlich in Form eines Offsets, schon auf ccc. Diese Adresse ist in dem Moment, in dem IF erreicht wird, noch nicht bekannt. Wie der Compiler das schafft? Eigentlich macht der Compiler das gar nicht. Das machen IF und THEN selbst.
: IF ( -- ) ?COMPILING \ Erklaerung folgt
  POSTPONE JOF
  HERE IFMARKE COMPOST!
  0 , ; IMMEDIATE

: THEN ( -- ) ?COMPILING
  HERE COMPOST@
  IFMARKE ?PAIRS
  OFFSET! ; IMMEDIATE
Alle Nichtstandardnamen in dieser Geschichte habe ich mir selbst ausgedacht. Ich verwende sie nur, um deutlich zu machen, was da passiert. In jedem Forth werden diese Namen und auch die Details anders sein, der generelle Gang der Handlung wird aber genau so sein, wie oben beschrieben.

BEGIN und UNTIL sollten nun kein Problem mehr darstellen.
: BEGIN ( -- )
  HERE BEGINMARKE COMPOST! ; IMMEDIATE
>>