X-Git-Url: https://thelambdalab.xyz/gitweb/index.cgi?a=blobdiff_plain;f=src%2Fforth.jl;h=80f6b76b9fc07eaa7e87f6591303e65b3842e68b;hb=d75b27e59e0ea50e52018239a74e1edc831219f7;hp=0194736c5f7788e8c409fb4f7cb7af9e669bdd0a;hpb=e1382f5faa586f2a3e26c4d328c5aa61cbe950a2;p=forth.jl.git diff --git a/src/forth.jl b/src/forth.jl index 0194736..80f6b76 100644 --- a/src/forth.jl +++ b/src/forth.jl @@ -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