diff --git a/src/interpreter.jl b/src/interpreter.jl index 954d2c0..e0a4815 100644 --- a/src/interpreter.jl +++ b/src/interpreter.jl @@ -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)