In this homework, let us experiment with creating and parsing expression trees in Julia.
tree(v::Tuple) = tree(v...)
tree(a,b) = throw("Need an odd number of arguments") # throw an error
tree(a) = throw("Need at least three arguments")
tree(a,b,c) = Expr(:call,a,b,c)
tree(v...) = Expr(:call,v[1],tree(v[2:end-1]),v[end])
tree (generic function with 6 methods)
@show tree(:*,:+,:^,:x,3,:y,4)
# Interchange args 2&3, and 5&6
@show tree(:*,:^,:+,:x,:y,3,4);
@show tree(:*,:^,:+,:x,3,:y,4);
tree(:*, :+, :^, :x, 3, :y, 4) = :((x ^ 3 + y) * 4) tree(:*, :^, :+, :x, :y, 3, 4) = :((x + y) ^ 3 * 4) tree(:*, :^, :+, :x, 3, :y, 4) = :((x + 3) ^ y * 4)
#using Pkg
#Pkg.add("Latexify")
using Latexify
See the latexify and how Julia's metaprogramming makes it so useful video from juliacon!
latexify(tree(:*,:+,:^,:x,3,:y,4) )
latexify(tree(:*,:^,:+,:x,:y,3,4) )
latexify(Expr(:call,:/,tree(:*,:+,:^,:x,3,:y,4),tree(:*,:^,:+,:x,:y,3,4)))
Build a reverse polish calculator in julia.
My high school math teacher (Gil Kessler) proudly showed me his reverse Polish HP calculator at a time when I had only heard of Texas Instruments. I believe it was a model like this HP 25 I thought reverse Polish was very strange, but he insisted it was way faster (fewer keystrokes).
#Answer:
#reverse_polish(v::Tuple) =
#reverse_polish(a,b,c) =
#reverse_polish(v...) =
# @test reverse_polish(3,4,5,:*,:-) == :(3 - 4 * 5)
# @test eval(reverse_polish(4,5,:*)) == 20