+ thisWord = lowercase(getString(lfa+2, len))
+
+ if thisWord == word
+ break
+ end
+ end
+
+ if lfa > 0
+ pushPS(lfa)
+ callPrim(mem[FROMLINK_CFA])
+ if (lenAndFlags & F_IMMED) == F_IMMED
+ pushPS(1)
+ else
+ pushPS(-1)
+ end
+ else
+ pushPS(countedAddr)
+ pushPS(0)
+ end
+
+ return NEXT
+end)
+
+FIND_CFA = defPrimWord("FIND", () -> begin
+
+ countedAddr = popPS()
+ context = mem[CONTEXT:(CONTEXT+mem[NUMCONTEXT]-1)]
+
+ for vocabCFA in reverse(context)
+ pushPS(countedAddr)
+ pushPS(vocabCFA)
+ callPrim(mem[FINDVOCAB_CFA])
+
+ callPrim(mem[DUP_CFA])
+ if popPS() != 0
+ return NEXT
+ else
+ popPS()
+ popPS()
+ end
+ end
+
+ pushPS(countedAddr)
+ pushPS(0)
+
+ return NEXT
+end)
+
+
+# Branching
+
+BRANCH_CFA = defPrimWord("BRANCH", () -> begin
+ reg.IP += mem[reg.IP]
+ return NEXT
+end)
+
+ZBRANCH_CFA = defPrimWord("0BRANCH", () -> begin
+ if (popPS() == 0)
+ reg.IP += mem[reg.IP]
+ else
+ reg.IP += 1
+ end
+
+ return NEXT
+end)
+
+# Strings
+
+LITSTRING_CFA = defPrimWord("LITSTRING", () -> begin
+ len = mem[reg.IP]
+ reg.IP += 1
+ pushPS(reg.IP)
+ pushPS(len)
+ reg.IP += len
+
+ return NEXT
+end)
+
+TYPE_CFA = defPrimWord("TYPE", () -> begin
+ len = popPS()
+ addr = popPS()
+ str = getString(addr, len)
+ print(str)
+ return NEXT
+end)
+
+# Interpreter/Compiler-specific I/O
+
+TIB_CFA = defConst("TIB", TIB)
+NUMTIB, NUMTIB_CFA = defNewVar("#TIB", 0)
+
+FIB_CFA = defConst("FIB", TIB)
+NUMFIB, NUMFIB_CFA = defNewVar("#FIB", 0)
+
+TOIN, TOIN_CFA = defNewVar(">IN", 0)
+
+SOURCE_ID, SOURCE_ID_CFA = defNewVar("SOURCE-ID", 0)
+
+SOURCE_CFA = defPrimWord("SOURCE", () -> begin
+ if mem[SOURCE_ID] == 0
+ pushPS(TIB)
+ pushPS(NUMTIB)
+ else
+ pushPS(FIB)
+ pushPS(NUMFIB)
+ end
+ return NEXT
+end)
+
+QUERY_CFA = defWord("QUERY",
+ [TIB_CFA, LIT_CFA, 160, EXPECT_CFA,
+ SPAN_CFA, FETCH_CFA, NUMTIB_CFA, STORE_CFA,
+ LIT_CFA, 0, TOIN_CFA, STORE_CFA,
+ EXIT_CFA])
+
+QUERY_FILE_CFA = defWord("QUERY-FILE",
+ [FIB_CFA, LIT_CFA, 160, ROT_CFA, READ_LINE_CFA,
+ DROP_CFA, SWAP_CFA,
+ NUMFIB_CFA, STORE_CFA,
+ EXIT_CFA])
+
+WORD_CFA = defPrimWord("WORD", () -> begin
+ delim = popPS()
+
+ callPrim(mem[SOURCE_CFA])
+ sizeAddr = popPS()
+ bufferAddr = popPS()
+
+ # Chew up initial occurrences of delim
+ while (mem[TOIN]<mem[sizeAddr] && mem[bufferAddr+mem[TOIN]] == delim)
+ mem[TOIN] += 1
+ end
+
+ countAddr = mem[H]
+ addr = mem[H]+1
+
+ # Start reading in word
+ count = 0
+ while (mem[TOIN]<mem[sizeAddr])
+ mem[addr] = mem[bufferAddr+mem[TOIN]]
+ mem[TOIN] += 1
+
+ if (mem[addr] == delim)
+ break
+ end
+
+ count += 1
+ addr += 1