Skip to content

Commit

Permalink
faster interpreter, use if's instead of dispatch
Browse files Browse the repository at this point in the history
  • Loading branch information
rcnlee committed Sep 14, 2018
1 parent 2ca8937 commit 16d0cb9
Showing 1 changed file with 17 additions and 23 deletions.
40 changes: 17 additions & 23 deletions src/interpreter.jl
Original file line number Diff line number Diff line change
Expand Up @@ -17,32 +17,26 @@ interpret(tab::SymbolTable, x::Any) = x
interpret(tab::SymbolTable, s::Symbol) = haskey(tab,s) ? tab[s] : getfield(Main, s)

function interpret(tab::SymbolTable, ex::Expr)
interpret(tab, ex, Val{ex.head})
end
function interpret(tab::SymbolTable, ex::Expr, ::Type{Val{:||}})
interpret(tab, ex.args[1]) || interpret(tab, ex.args[2])
end
function interpret(tab::SymbolTable, ex::Expr, ::Type{Val{:&&}})
interpret(tab, ex.args[1]) && interpret(tab, ex.args[2])
end
function interpret(tab::SymbolTable, ex::Expr, ::Type{Val{:call}})
f = interpret(tab, ex.args[1])
result = call_func(tab, ex.args...)
result
end
function interpret(tab::SymbolTable, ex::Expr, ::Type{Val{:(=)}})
tab[ex.args[1]] = interpret(tab, ex.args[2]) #assignments done to symboltable
end
function interpret(tab::SymbolTable, ex::Expr, ::Type{Val{:block}})
result = nothing
for x in ex.args
result = interpret(tab, x)
result = if ex.head == :call
f = interpret(tab, ex.args[1])
call_func(tab, ex.args...)
elseif ex.head == :||
interpret(tab, ex.args[1]) || interpret(tab, ex.args[2])
elseif ex.head == :&&
interpret(tab, ex.args[1]) && interpret(tab, ex.args[2])
elseif ex.head == :(=)
tab[ex.args[1]] = interpret(tab, ex.args[2]) #assignments done to symboltable
elseif ex.head == :block
result = nothing
for x in ex.args
result = interpret(tab, x)
end
result
else
error("Expression type not supported")
end
result
end
function interpret(tab::SymbolTable, ex::Expr, x)
error("Expression type not supported")
end

#unroll for performance and avoid excessive allocations
function call_func(tab::SymbolTable, f, x1)
Expand Down

0 comments on commit 16d0cb9

Please sign in to comment.