Taking a more traditional approach now.
authorTim Vaughan <tgvaughan@gmail.com>
Sat, 9 Apr 2016 10:21:12 +0000 (22:21 +1200)
committerTim Vaughan <tgvaughan@gmail.com>
Sat, 9 Apr 2016 10:21:12 +0000 (22:21 +1200)
src/forth.jl

index 7f5756e..ca57e87 100644 (file)
@@ -1,93 +1,16 @@
 module forth
 
-instream = STDIN
+RS = Array{Int64, 1}()
+DS = Array{Int64, 1}()
 
-currentLine = ""
-currentPos = 0
+primitives = Array{Expr,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
+type Definition
+    name::AbstractString
+    data::Array{Int64,1}
 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
-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 = []
-"""
-
-instream = IOBuffer(firstProg)
-repl()
 
 end