Slowly getting to grips with this.
[forth.jl.git] / src / forth.jl
index 7f5756e..0aa33d7 100644 (file)
@@ -1,93 +1,20 @@
 module forth
 
-instream = STDIN
+RS = Array{Int64, 1}()
+DS = Array{Int64, 1}()
 
-currentLine = ""
-currentPos = 0
+primitives = Array{Expr,1}()
+memory = Array{Int,1}()
+headers = Array{Tuple{AbstractString, Int},1}
 
-function readPattern(pattern::Regex)
-
-    if currentPos<1 || currentPos>length(currentLine)
-        if eof(instream)
-            return ""
-        else
-            global currentLine = readline(instream)
-            global currentPos = 1
-        end
-    end
-
-    m = match(pattern, currentLine[currentPos:length(currentLine)])
-    if m != nothing
-        global currentPos += length(m.match)
-        return m.match
-    else
-        return ""
-    end
-end
-
-readSpaces() = readPattern(r"^([ \t]*)")
-readWord() = readPattern(r"^([^\s]+)")
-readNewline() = readPattern(r"^(\n)")
-readRestOfLine() = readPattern(r"^([^\n]*)")
-
-word = ""
-function getWordOrNewline()
-    global word = readWord()
-    if word == ""
-        global word = readNewline()
-    end
+function addPrim(name::AbstractString, expr::Expr)
+    push!(primitives, expr)
+    push!(memory, -length(primitives))
+    push!(headers, length(memory))
 end
 
-modes = Dict{AbstractString,Function}()
-mode = ""
-
-dict = Dict{AbstractString, Function}()
-dict["%J"] = () -> begin
-    rol = readRestOfLine()
-    println("Evaluating '$rol'")
-    eval(parse(rol))
-end
-
-function interpretPrimitive()
-    if haskey(dict, word)
-        dict[word]()
-        return true
-    else
-        return false
-    end
-end
-interpretNonPrimitive() = false
-interpretNumber() = false
-
-modes["interpret"] = () -> begin
-    getWordOrNewline()
-
-    if ! (interpretPrimitive() ||
-        interpretNonPrimitive() ||
-        interpretNumber())
-        println("Error: unknown word '$word'.")
-    end
-end
-
-function repl()
-
-    global mode = "interpret"
-    idx = 1
-    while mode != "stop"
-        modes[mode]()
-    end
-end
-
-# Bootstrapping interpreter
-
-firstProg = """%J dict["\\n"] = () -> nothing
-%J dict["\\n"] = () -> nothing
-%J dict[""] = () -> global mode = "stop"
-%J global DS = []
-%J global RS = []
-"""
+addPrim("docol", :(begin
 
-instream = IOBuffer(firstProg)
-repl()
+end))
 
 end