CREATE/DOES> working. Closes #2.
[forth.jl.git] / src / forth.jl
index 0194736..80f6b76 100644 (file)
@@ -902,6 +902,9 @@ end)
 
 # Compilation
 
+HERE = defWord("HERE",
+    [H_CFA, FETCH, EXIT])
+
 HEADER = defPrimWord("HEADER", () -> begin
     wordAddr = popPS()+1
     wordLen = mem[wordAddr-1]
@@ -912,6 +915,39 @@ HEADER = defPrimWord("HEADER", () -> begin
     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