I am trying to understand memoization.jl by simonster to obtain a good understanding of macros. First I tried to macroexpand the output:
julia> using Memoize
julia> macroexpand(:(@memoize function x(a) a end))
quote  # /home/wangc/.julia/v0.6/Memoize/src/Memoize.jl, line 107:
    function ##x_unmemoized(a) # REPL[3], line 1:
        a
    end # /home/wangc/.julia/v0.6/Memoize/src/Memoize.jl, line 108:
    empty!(ObjectIdDict()) # /home/wangc/.julia/v0.6/Memoize/src/Memoize.jl, line 109:
    x(a)::Any = begin  # /home/wangc/.julia/v0.6/Memoize/src/Memoize.jl, line 109:
            if haskey(ObjectIdDict(), (a,))
                (ObjectIdDict())[(a,)]::Core.Inference.return_type(##x_unmemoized, typeof((a,)))
            else 
                (ObjectIdDict())[(a,)] = ##x_unmemoized(a)
            end
        end
end
It is really weird. I think ##x_unmemoized is intended to be a function but since it starts with #, it should be a comment. Then I tried to evaluate it:
julia> eval(macroexpand(:(@memoize function x(a) a end)))
x (generic function with 1 method)
Everything seems to be fine. However, if I copy the output of macroexpand:
julia> quote  # /home/wangc/.julia/v0.6/Memoize/src/Memoize.jl, line 107:
           function ##x_unmemoized(a) # REPL[3], line 1:
               a
           end # /home/wangc/.julia/v0.6/Memoize/src/Memoize.jl, line 108:
           empty!(ObjectIdDict()) # /home/wangc/.julia/v0.6/Memoize/src/Memoize.jl, line 109:
           x(a)::Any = begin  # /home/wangc/.julia/v0.6/Memoize/src/Memoize.jl, line 109:
                   if haskey(ObjectIdDict(), (a,))
                       (ObjectIdDict())[(a,)]::Core.Inference.return_type(##x_unmemoized, typeof((a,)))
                   else 
                       (ObjectIdDict())[(a,)] = ##x_unmemoized(a)
                   end
               end
       end
ERROR: syntax: unexpected else
Stacktrace:
 [1] macro expansion at ./REPL.jl:97 [inlined]
 [2] (::Base.REPL.##1#2{Base.REPL.REPLBackend})() at ./event.jl:73
I am totally confused about what is happening here. Anyone give me a hint?