+
+QUIT = defWord("QUIT",
+ [LIT, 0, STATE_CFA, STORE,
+ LIT, 0, NUMTIB_CFA, STORE,
+ RSP0_CFA, RSPSTORE,
+ QUERY,
+ INTERPRET, PROMPT,
+ BRANCH,-4])
+
+ABORT = defWord("ABORT",
+ [PSP0_CFA, PSPSTORE, QUIT])
+
+INCLUDE = defPrimWord("INCLUDE", () -> begin
+ pushPS(32)
+ callPrim(mem[WORD])
+ wordAddr = popPS()+1
+ wordLen = mem[wordAddr-1]
+ word = getString(wordAddr, wordLen)
+
+ push!(sources, open(word, "r"))
+
+ # Clear input buffer
+ mem[NUMTIB] = 0
+
+ return NEXT
+end)
+
+# Compilation
+
+HERE = defWord("HERE",
+ [H_CFA, FETCH, EXIT])
+
+HEADER = defPrimWord("HEADER", () -> begin
+ wordAddr = popPS()+1
+ wordLen = mem[wordAddr-1]
+ word = getString(wordAddr, wordLen)
+
+ createHeader(word, 0)
+
+ return NEXT
+end)
+
+CREATE = defWord("CREATE",
+ [LIT, 32, WORD, HEADER,
+ LIT, DOVAR, COMMA,
+ EXIT])
+
+DODOES = defPrim(() -> begin
+ pushRS(reg.IP)
+ reg.IP = popPS()
+ pushPS(reg.W + 1)
+ return NEXT
+end, name="DODOES")
+
+DOES_HELPER = defPrimWord("(DOES>)", () -> begin
+
+ pushPS(mem[LATEST])
+ callPrim(mem[TOCFA])
+ cfa = popPS()
+
+ runtimeAddr = popPS()
+
+ mem[cfa] = defPrim(eval(:(() -> begin
+ pushPS($(runtimeAddr))
+ return DODOES
+ end)), name="doesPrim")
+
+ return NEXT
+end, flags=F_IMMED)
+
+DOES = defWord("DOES>",
+ [BTICK, LIT, COMMA, HERE, LIT, 3, ADD, COMMA,
+ BTICK, DOES_HELPER, COMMA, BTICK, EXIT, COMMA, EXIT],
+ flags=F_IMMED)
+
+LBRAC = defPrimWord("[", () -> begin
+ mem[STATE] = 0
+ return NEXT
+end, flags=F_IMMED)
+
+RBRAC = defPrimWord("]", () -> begin
+ mem[STATE] = 1
+ return NEXT
+end, flags=F_IMMED)
+
+HIDDEN = defPrimWord("HIDDEN", () -> begin
+ lenAndFlagsAddr = mem[LATEST] + 1
+ mem[lenAndFlagsAddr] = mem[lenAndFlagsAddr] $ F_HIDDEN
+ return NEXT
+end)
+
+COLON = defWord(":",
+ [LIT, 32, WORD,
+ HEADER,
+ LIT, DOCOL, COMMA,
+ HIDDEN,
+ RBRAC,
+ EXIT])
+
+SEMICOLON = defWord(";",
+ [LIT, EXIT, COMMA,
+ HIDDEN,
+ LBRAC,
+ EXIT], flags=F_IMMED)
+
+IMMEDIATE = defPrimWord("IMMEDIATE", () -> begin
+ lenAndFlagsAddr = mem[LATEST] + 1
+ mem[lenAndFlagsAddr] = mem[lenAndFlagsAddr] $ F_IMMED
+ return NEXT
+end, flags=F_IMMED)
+
+