module forth
-RS = Array{Int64, 1}()
-DS = Array{Int64, 1}()
+RS = Array{Int, 1}()
+DS = Array{Int, 1}()
+
+IP = 0
+W = 0
+X = 0
+jmp = nothing
primitives = Array{Expr,1}()
+memory = Array{Int64,1}()
+headers = Array{Tuple{AbstractString, Int64},1}()
+
+function addPrim(name::AbstractString, expr::Expr)
+ push!(primitives, expr)
+ push!(memory, -length(primitives))
+ push!(headers, (name, length(memory)))
+
+ return expr
+end
+NEXT = addPrim("next", :(begin
+ W = memory[IP]
+ IP += 1
+ X = memory[W]
+ jmp = primitives[-X]
+end))
+DOCOL = addPrim("docol", :(begin
+ push!(RS, IP)
+ IP = W + 1
+ jmp = NEXT
+end))
-type Definition
- name::AbstractString
- data::Array{Int64,1}
-end
+EXIT = addPrim("exit", :(begin
+ IP = pop!(RS)
+ jmp = NEXT
+end))
+# VM loop
+#jmp = NEXT
+#while true
+# eval(jmp)
+#end
end