Getting somewhere.
[forth.jl.git] / src / forth.jl
1 module forth
2
3 RS = Array{Int, 1}()
4 DS = Array{Int, 1}()
5
6 IP = 0
7 W = 0
8 X = 0
9 jmp = nothing
10
11 primitives = Array{Expr,1}()
12 memory = Array{Int64,1}()
13 headers = Array{Tuple{AbstractString, Int64},1}()
14
15 function addPrim(name::AbstractString, expr::Expr)
16     push!(primitives, expr)
17     push!(memory, -length(primitives))
18     push!(headers, (name, length(memory)))
19     
20     return expr
21 end
22
23 NEXT = addPrim("next", :(begin
24     W = memory[IP]
25     IP += 1
26     X = memory[W]
27     jmp = primitives[-X]
28 end))
29
30 DOCOL = addPrim("docol", :(begin
31     push!(RS, IP)
32     IP = W + 1
33     jmp = NEXT
34 end))
35
36 EXIT = addPrim("exit", :(begin
37     IP = pop!(RS)
38     jmp = NEXT
39 end))
40
41 # VM loop
42 #jmp = NEXT
43 #while true
44 #    eval(jmp)
45 #end
46
47 end