FluxML / MacroTools.jl

MacroTools provides a library of tools for working with Julia code and expressions.
https://fluxml.ai/MacroTools.jl/stable/
Other
310 stars 79 forks source link

Match failure when combining Unions and expression types #36

Open rdeits opened 7 years ago

rdeits commented 7 years ago

It appears that attempting to create an @match that uses unions and expression types results in no matches being found. A few examples:

This works:

julia> @match :(x[1]) begin
           (v_ref) => (v)
       end
:(x[1])

But adding a union gives no match:

julia> @match :(x[1]) begin
           (v_ref |
           (v_ref <= ub_)) => (v)
       end

Removing the _ref tag fixes it:

julia> @match :(x[1]) begin
           (v_ |
           (v_ <= ub_)) => (v)
       end
:(x[1])

Similarly, with a _Symbol tag, this works:

julia> @match :(x) begin
           (v_Symbol) => (v)
       end
:x

and this doesn't:

@match :(x) begin
    (v_Symbol |
    (v_Symbol <= ub_)) => (v)
end

Do unions just not support type restrictions?

MikeInnes commented 7 years ago

There's no intentional reason why this couldn't be supported, but it may just be that we parse the unions before the types and then the types parser can't see inside the union. Not sure, but it should be fixable at any rate.

rdeits commented 7 years ago

Ok, thanks! I think I may have a fix for this...