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