Notice that unlike other forths, forth.jl echos a newline after reading each
line of standard input. This is an unfortunate side-effect of the way that
-I've implemented the primitive word KEY. Hopefully I'll be able to fix this
-in future.
+I've implemented EXPECT. Hopefully I'll be able to fix this in future.
There's an example Mandelbrot Set drawing program included in the examples
directory. To run it, you'll have to locate this directory on your system (its
location depends on what OS you happen to be using and how julia is installed).
-Once found, use the "INCLUDE" word to compile its definitions. For example, on
+Once found, use the INCLUDE word to compile its definitions. For example, on
my system I can run the example in this way:
include /home/tim/.julia/v0.4/forth/examples/mandelbrot.4th
# Built-in variables
nextVarAddr = 1
-RSP0 = nextVarAddr; nextVarAddr += 1
-PSP0 = nextVarAddr; nextVarAddr += 1
HERE = nextVarAddr; nextVarAddr += 1
LATEST = nextVarAddr; nextVarAddr += 1
-mem[RSP0] = nextVarAddr # bottom of RS
-mem[PSP0] = mem[RSP0] + size_RS # bottom of PS
-TIB = mem[PSP0] + size_PS # address of terminal input buffer
-mem[HERE] = TIB + size_TIB # location of bottom of dictionary
-mem[LATEST] = 0 # no previous definition
+RSP0 = nextVarAddr # bottom of RS
+PSP0 = RSP0 + size_RS # bottom of PS
+TIB = PSP0 + size_PS # address of terminal input buffer
+mem[HERE] = TIB + size_TIB # location of bottom of dictionary
+mem[LATEST] = 0 # no previous definition
DICT = mem[HERE] # Save bottom of dictionary as constant
IP::Int64 # Instruction pointer
W::Int64 # Working register
end
-reg = Reg(mem[RSP0], mem[PSP0], 0, 0)
+reg = Reg(RSP0, PSP0, 0, 0)
# Stack manipulation functions
Base.showerror(io::IO, ex::ParamStackUnderflow) = print(io, "Parameter stack underflow.")
Base.showerror(io::IO, ex::ReturnStackUnderflow) = print(io, "Return stack underflow.")
-getRSDepth() = reg.RSP - mem[RSP0]
-getPSDepth() = reg.PSP - mem[PSP0]
+getRSDepth() = reg.RSP - RSP0
+getPSDepth() = reg.PSP - PSP0
function ensurePSDepth(depth::Int64)
if getPSDepth()<depth
HERE_CFA = defExistingVar("HERE", HERE)
LATEST_CFA = defExistingVar("LATEST", LATEST)
-PSP0_CFA = defExistingVar("PSP0", PSP0)
-RSP0_CFA = defExistingVar("RSP0", RSP0)
+
+PSP0_CFA = defConst("PSP0", PSP0)
+RSP0_CFA = defConst("RSP0", RSP0)
defConst("DOCOL", DOCOL)
defConst("DOCON", DOCON)
QUIT = defWord("QUIT",
[LIT, 0, STATE_CFA, STORE,
LIT, 0, NUMTIB_CFA, STORE,
- RSP0_CFA, FETCH, RSPSTORE,
+ RSP0_CFA, RSPSTORE,
QUERY,
INTERPRET, PROMPT,
BRANCH,-4])
ABORT = defWord("ABORT",
- [PSP0_CFA, FETCH, PSPSTORE, QUIT])
+ [PSP0_CFA, PSPSTORE, QUIT])
INCLUDE = defPrimWord("INCLUDE", () -> begin
pushPS(32)
end
function printPS()
- count = reg.PSP - mem[PSP0]
+ count = reg.PSP - PSP0
if count > 0
print("<$count>")
- for i in (mem[PSP0]+1):reg.PSP
+ for i in (PSP0+1):reg.PSP
print(" $(mem[i])")
end
println()
end
function printRS()
- count = reg.RSP - mem[RSP0]
+ count = reg.RSP - RSP0
if count > 0
print("<$count>")
- for i in (mem[RSP0]+1):reg.RSP
+ for i in (RSP0+1):reg.RSP
print(" $(mem[i])")
end
println()