module forth
-import Base.REPLCompletions
+import Base.REPLCompletions, Base.invokelatest
# VM mem size
size_mem = 1000000 # 1 mega-int
if addr >=0 || -addr>length(primitives)
error("Attempted to execute non-existent primitive at address $addr.")
else
- primitives[-addr]()
+ invokelatest(primitives[-addr])
end
end
getPrimName(addr::Int64) = primNames[-addr]
XOR_CFA = defPrimWord("XOR", () -> begin
b = popPS()
a = popPS()
- pushPS(a $ b)
+ pushPS(xor(a, b))
return NEXT
end)
addr = popPS()
fh = openFiles[fid]
- line = readline(fh)
+ line = readline(fh, chomp=false)
eofFlag = endswith(line, '\n') ? 0 : -1
line = chomp(line)
- #println("Reading: $line");
-
putString(line, addr, maxSize)
pushPS(length(line))
return NEXT
end)
+READ_FILE_CFA = defPrimWord("READ-FILE", () -> begin
+ fid = popPS()
+ size = popPS()
+ addr = popPS()
+
+ fh = openFiles[fid]
+
+ string = join(map(x -> Char(x), read(fh, size)), "")
+
+ eofFlag = length(string) == size ? 0 : -1 ;
+
+ putString(string, addr, length(string))
+
+ pushPS(length(string))
+ pushPS(eofFlag)
+
+ return NEXT
+end)
+
EMIT_CFA = defPrimWord("EMIT", () -> begin
print(Char(popPS()))
HIDDEN_CFA = defPrimWord("HIDDEN", () -> begin
lenAndFlagsAddr = mem[mem[CURRENT]+1] + 1
- mem[lenAndFlagsAddr] = mem[lenAndFlagsAddr] $ F_HIDDEN
+ mem[lenAndFlagsAddr] = xor(mem[lenAndFlagsAddr], F_HIDDEN)
return NEXT
end)
IMMEDIATE_CFA = defPrimWord("IMMEDIATE", () -> begin
lenAndFlagsAddr = mem[mem[CURRENT]+1] + 1
- mem[lenAndFlagsAddr] = mem[lenAndFlagsAddr] $ F_IMMED
+ mem[lenAndFlagsAddr] = xor(mem[lenAndFlagsAddr], F_IMMED)
return NEXT
end, flags=F_IMMED)