+ return NEXT
+end)
+
+HERE_CFA = defWord("HERE",
+ [H_CFA, FETCH_CFA, EXIT_CFA])
+
+HEADER_CFA = defPrimWord("HEADER", () -> begin
+ wordAddr = popPS()+1
+ wordLen = mem[wordAddr-1]
+ word = getString(wordAddr, wordLen)
+
+ createHeader(word, 0)
+
+ return NEXT
+end)
+
+CREATE_CFA = defWord("CREATE",
+ [LIT_CFA, 32, WORD_CFA, HEADER_CFA,
+ LIT_CFA, DOVAR, COMMA_CFA,
+ EXIT_CFA])
+
+DODOES = defPrim(() -> begin
+ pushRS(reg.IP)
+ reg.IP = popPS()
+ pushPS(reg.W + 1)
+ return NEXT
+end, name="DODOES")
+
+DOES_HELPER_CFA = defPrimWord("(DOES>)", () -> begin
+
+ pushPS(mem[mem[CURRENT]+1])
+ callPrim(mem[FROMLINK_CFA])
+ cfa = popPS()
+
+ runtimeAddr = popPS()
+
+ mem[cfa] = defPrim(eval(:(() -> begin
+ pushPS($(runtimeAddr))
+ return DODOES
+ end)), name="doesPrim")
+
+ return NEXT
+end, flags=F_IMMED | F_HIDDEN)
+
+DOES_CFA = defWord("DOES>",
+ [LIT_CFA, LIT_CFA, COMMA_CFA, HERE_CFA, LIT_CFA, 3, ADD_CFA, COMMA_CFA,
+ LIT_CFA, DOES_HELPER_CFA, COMMA_CFA, LIT_CFA, EXIT_CFA, COMMA_CFA, EXIT_CFA],
+ flags=F_IMMED)
+
+LBRAC_CFA = defPrimWord("[", () -> begin
+ mem[STATE] = 0
+ return NEXT
+end, flags=F_IMMED)
+
+RBRAC_CFA = defPrimWord("]", () -> begin
+ mem[STATE] = 1
+ return NEXT
+end, flags=F_IMMED)
+
+HIDDEN_CFA = defPrimWord("HIDDEN", () -> begin
+ lenAndFlagsAddr = mem[mem[CURRENT]+1] + 1
+ mem[lenAndFlagsAddr] = mem[lenAndFlagsAddr] $ F_HIDDEN
+ return NEXT
+end)
+
+COLON_CFA = defWord(":",
+ [LIT_CFA, 32, WORD_CFA,
+ HEADER_CFA,
+ LIT_CFA, DOCOL, COMMA_CFA,
+ HIDDEN_CFA,
+ RBRAC_CFA,
+ EXIT_CFA])
+
+SEMICOLON_CFA = defWord(";",
+ [LIT_CFA, EXIT_CFA, COMMA_CFA,
+ HIDDEN_CFA,
+ LBRAC_CFA,
+ EXIT_CFA], flags=F_IMMED)
+
+IMMEDIATE_CFA = defPrimWord("IMMEDIATE", () -> begin
+ lenAndFlagsAddr = mem[mem[CURRENT]+1] + 1
+ mem[lenAndFlagsAddr] = mem[lenAndFlagsAddr] $ F_IMMED
+ return NEXT
+end, flags=F_IMMED)
+
+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"