From bc72871b5a63fc748a71d55d87afca3746d8d219 Mon Sep 17 00:00:00 2001 From: Tim Vaughan Date: Sun, 10 Apr 2016 01:19:05 +1200 Subject: [PATCH] Getting somewhere. --- src/forth.jl | 39 +++++++++++++++++++++++++++++++++------ 1 file changed, 33 insertions(+), 6 deletions(-) diff --git a/src/forth.jl b/src/forth.jl index 0aa33d7..67dd77d 100644 --- a/src/forth.jl +++ b/src/forth.jl @@ -1,20 +1,47 @@ 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{Int,1}() -headers = Array{Tuple{AbstractString, Int},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, length(memory)) + push!(headers, (name, length(memory))) + + return expr end -addPrim("docol", :(begin +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)) +EXIT = addPrim("exit", :(begin + IP = pop!(RS) + jmp = NEXT +end)) + +# VM loop +#jmp = NEXT +#while true +# eval(jmp) +#end + end -- 2.20.1