From: Tim Vaughan Date: Sat, 9 Apr 2016 13:19:05 +0000 (+1200) Subject: Getting somewhere. X-Git-Url: https://thelambdalab.xyz/gitweb/index.cgi?a=commitdiff_plain;h=bc72871b5a63fc748a71d55d87afca3746d8d219;p=forth.jl.git Getting somewhere. --- 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