+# Strings
+
+LITSTRING = defPrimWord("LITSTRING", () -> begin
+ len = mem[reg.IP]
+ reg.IP += 1
+ pushPS(reg.IP)
+ pushPS(len)
+ reg.IP += len
+
+ return NEXT
+end)
+
+TYPE = defPrimWord("TYPE", () -> begin
+ len = popPS()
+ addr = popPS()
+ str = getString(addr, len)
+ print(str)
+ return NEXT
+end)
+
+# Outer interpreter
+
+defConst("TIB", TIB)
+NUMTIB, NUMTIB_CFA = defNewVar("#TIB", 0)
+TOIN, TOIN_CFA = defNewVar(">IN", 0)
+
+QUERY = defWord("QUERY",
+ [LIT, TIB, LIT, 80, EXPECT,
+ LIT, SPAN, FETCH, NUMTIB, STORE,
+ LIT, 0, TOIN, STORE,
+ EXIT])
+
+EXECUTE = defPrimWord("EXECUTE", () -> begin
+ reg.W = popPS()
+ return mem[reg.W]
+end)
+
+STATE, STATE_CFA = defNewVar("STATE", 0)
+
+INTERPRET = defWord("INTERPRET",
+ [LIT, 32, WORD, # Read next space-delimited word
+
+ DUP, FETCH, ZEQ, ZBRANCH, 3,
+ DROP, EXIT, # Exit if TIB is exhausted
+
+ STATE_CFA, FETCH, ZBRANCH, 26,
+ # Compiling
+ DUP, FIND, ZBRANCH, 17,
+
+ # Found word.
+ DUP, TOCFA, SWAP, INCR, FETCH, LIT, F_IMMED, AND, ZBRANCH, 4,
+ # Immediate: Execute!
+ EXECUTE, BRANCH, -30,