X-Git-Url: https://thelambdalab.xyz/gitweb/index.cgi?p=forth.jl.git;a=blobdiff_plain;f=src%2Fforth.jl;fp=src%2Fforth.jl;h=9939c9c2e7ee2b8fbc856a68f3da4f0f1ad34396;hp=9beb81485ead812a6b7022c8ba8bfd987a441f15;hb=3a6f6d8ce275a51f67a8fde0a89ac9deb0020217;hpb=3f94f6047a8788a3ba10ec6c267eff0e08400d7f diff --git a/src/forth.jl b/src/forth.jl index 9beb814..9939c9c 100644 --- a/src/forth.jl +++ b/src/forth.jl @@ -1134,42 +1134,18 @@ IMMEDIATE_CFA = defPrimWord("IMMEDIATE", () -> begin 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" - break - end - - exprString = string(exprString, " ", thisWord) - end - exprString = string(exprString, "\nreturn NEXT\nend") - - func = eval(parse(exprString)) - dictWrite(defPrim(func)) +# ( addr n -- primAddr ) +CREATE_PRIM_CFA = defPrimWord("CREATE-PRIM", () -> begin + len = popPS() + addr = popPS() + + exprString = string("() -> begin\n", + getString(addr, len), "\n", + "return NEXT\n", + "end") + func = eval(parse(expString)) + pushPS(defPrim(func)) return NEXT end)