+CODE_CFA = defPrimWord("CODE", () -> begin
+ pushPS(32)
+ callPrim(mem[WORD_CFA])
+ callPrim(mem[HEADER_CFA])
+
+ exprString = "() -> begin\n"
+ while true
+ if mem[TOIN] >= mem[NUMTIB]
+ exprString = string(exprString, "\n")
+ if currentSource() == STDIN
+ println()
+ end
+
+ pushPS(TIB)
+ pushPS(160)
+ callPrim(mem[EXPECT_CFA])
+ mem[NUMTIB] = mem[SPAN]
+ mem[TOIN] = 0
+ end
+
+ pushPS(32)
+ callPrim(mem[WORD_CFA])
+ cAddr = popPS()
+ thisWord = getString(cAddr+1, mem[cAddr])
+
+ if uppercase(thisWord) == "END-CODE"
+ break
+ end
+
+ exprString = string(exprString, " ", thisWord)
+ end
+ exprString = string(exprString, "\nreturn NEXT\nend")
+
+ func = eval(parse(exprString))
+ dictWrite(defPrim(func))
+
+ return NEXT
+end)
+
+# Outer Interpreter
+
+EXECUTE_CFA = defPrimWord("EXECUTE", () -> begin
+ reg.W = popPS()
+ return mem[reg.W]
+end)
+
+INTERPRET_CFA = defWord("INTERPRET",
+ [LIT_CFA, 32, WORD_CFA, # Read next space-delimited word
+
+ DUP_CFA, FETCH_CFA, ZE_CFA, ZBRANCH_CFA, 3,
+ DROP_CFA, EXIT_CFA, # Exit if TIB is exhausted
+
+ STATE_CFA, FETCH_CFA, ZBRANCH_CFA, 24,
+ # Compiling
+ FIND_CFA, QDUP_CFA, ZBRANCH_CFA, 13,
+
+ # Found word.
+ LIT_CFA, -1, EQ_CFA, INVERT_CFA, ZBRANCH_CFA, 4,
+
+ # Immediate: Execute!
+ EXECUTE_CFA, BRANCH_CFA, -26,
+
+ # Not immediate: Compile!
+ COMMA_CFA, BRANCH_CFA, -29,
+
+ # No word found, parse number
+ NUMBER_CFA, LIT_CFA, LIT_CFA, COMMA_CFA, COMMA_CFA, BRANCH_CFA, -36,
+
+ # Interpreting
+ FIND_CFA, QDUP_CFA, ZBRANCH_CFA, 5,
+
+ # Found word. Execute!
+ DROP_CFA, EXECUTE_CFA, BRANCH_CFA, -44,
+
+ # No word found, parse number and leave on stack
+ NUMBER_CFA, BRANCH_CFA, -47,
+ EXIT_CFA])
+
+PROMPT_CFA = defPrimWord("PROMPT", () -> begin
+ if mem[STATE] == 0
+ print(" ok")
+ end
+ println()
+
+ return NEXT
+end)
+
+QUIT_CFA = defWord("QUIT",
+ [LIT_CFA, 0, STATE_CFA, STORE_CFA,
+ LIT_CFA, 0, NUMTIB_CFA, STORE_CFA,
+ RSP0_CFA, RSPSTORE_CFA,
+ QUERY_CFA,
+ INTERPRET_CFA, PROMPT_CFA,
+ BRANCH_CFA,-4])