8 function readPattern(pattern::Regex)
10 if currentPos<1 || currentPos>length(currentLine)
14 global currentLine = readline(instream)
19 m = match(pattern, currentLine[currentPos:length(currentLine)])
21 global currentPos += length(m.match)
28 readSpaces() = readPattern(r"^([ \t]*)")
29 readWord() = readPattern(r"^([^\s]+)")
30 readNewline() = readPattern(r"^(\n)")
31 readRestOfLine() = readPattern(r"^([^\n]*)")
34 function getWordOrNewline()
35 global word = readWord()
37 global word = readNewline()
41 modes = Dict{AbstractString,Function}()
44 dict = Dict{AbstractString, Function}()
45 dict["%J"] = () -> begin
46 rol = readRestOfLine()
47 println("Evaluating '$rol'")
51 function interpretPrimitive()
59 interpretNonPrimitive() = false
60 interpretNumber() = false
62 modes["interpret"] = () -> begin
65 if ! (interpretPrimitive() ||
66 interpretNonPrimitive() ||
68 println("Error: unknown word '$word'.")
74 global mode = "interpret"
81 # Bootstrapping interpreter
83 firstProg = """%J dict["\\n"] = () -> nothing
84 %J dict["\\n"] = () -> nothing
85 %J dict[""] = () -> global mode = "stop"
90 instream = IOBuffer(firstProg)