204b
<< <> >>

2. The compiler

When having a definition with
... aaa IF bbb THEN ccc ...
inside, and it's decompiled, something like the following will show up:
... aaa, JOF addr, bbb, ccc, ...
IF has turned into JOF (jump on false) followed by a (relative) address.
THEN has completely vanished, which makes sense because the address already points to ccc , most likely in the form of an offset. The needed address however, is not yet known at the moment IF is reached.

How did the compiler pull that of?

In fact, the compiler doesn't, IF and THEN have taken care of it themselves.
: IF ( -- ) ?COMPILING \ Explanation follows
  POSTPONE JOF
  HERE IFADMIN COMADMIN!
  0 , ; IMMEDIATE

: THEN ( -- ) ?COMPILING
  HERE COMADMIN@
  IFADMIN ?PAIRS
  OFFSET! ; IMMEDIATE
All non-standard names in this article are made up. They're only used to clarify what happens. In any particular Forth these names and details will differ. However, the global way of working will match the above description.

BEGIN and UNTIL should not pose a problem any more.
: BEGIN ( -- )
  HERE BEGINADMIN COMADMIN! ; IMMEDIATE
>>