enum.jl
macro enum(T,syms...)
blk = quote
immutable $(esc(T))
n::Int32
$(esc(T))(n::Integer) = new(n)
end
Base.show(io::IO, x::$(esc(T))) = print(io, $syms[x.n+1])
Base.show(io::IO, x::Type{$(esc(T))}) = print(io, $(string("enum ", T, ' ', '(', join(syms, ", "), ')')))
end
for (i,sym) in enumerate(syms)
push!(blk.args, :(const $(esc(sym)) = $(esc(T))($(i-1))))
end
push!(blk.args, :nothing)
blk.head = :toplevel
return blk
end