Forth Interpreting Itself adDendum

Last weekend I eliminated the last Swift from the interpreting loop. There are now two pre-predefined words: an outer loop that reads a line of text and calls the the interpreter from the last post and the inner loop that interprets words from a line. The code for each looks something like this:

: .readLoop 2 branch .interpreter refill -4 0<>branch? ;
: .interpreter 
    6 branch
    .interpretOrCompile 2 0=branch? execute
    .wordForInterpreter 1 + dup 1 - c@
    -17 0<>branch?
    drop drop

In both cases, it helps to understand that the loop condition is at the end of the code, instead of the natural location at the beginning and the first instruction, therefore, branches unconditionally to the loop condition calculation i.e.

while calculate loop condition
    do stuff


    branch calculate
    do stuff
    calculate loop condition
    branch if true loopBody

This may seem a bit odd, but it saves a branch execution on every iteration of the loop over putting the loop condition at the front.

.readLoop is word 0 and .interpreter is word 1.

The Swift code is now

			wordNumber = 0
			wordIndex = 0
			try resume()

We just point the Forth machine at the read loop and tell it to go.

That ends the creation of a Forth interpreter in Forth, so the branch is now merged back into master and we can get on with defining the remaining core words.

Leave a Reply

Fill in your details below or click an icon to log in: Logo

You are commenting using your account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s

This site uses Akismet to reduce spam. Learn how your comment data is processed.