FluxML / MacroTools.jl

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

provides ways to circumvent unexpected type bindings #160

Open aviatesk opened 3 years ago

aviatesk commented 3 years ago

This PR fixes issues involved with the syntaxes to specify expression types.

Currently, @capture and @match can't distinguish between their syntax to specify a :head of Expr and a variable name with underscores. For example, in the example below, @capture recognizes global_string as the syntax to specify Expr's head (i.e. :string), not as a simple variable name:

julia> ex = :(global_string = 10);
julia> @capture(ex, global_string = n_) # tries to match `Expr(:string, ...) = n_` and bound the matched lhs into a variable `global` and the matched rhs into a variable `n`.
false

Since an expression can really have an arbitrary head, @capture macro can't really distinguish them (while we can do some assertion when the syntax to specify atomic expression type, though).

This PR implements new macros @capture_notb and @match_notb, which ignore all the expression type matching syntaxes and provide the ways to circumvent the issue described above:

julia> ex = :(global_string = 10)
julia> @capture_notb(ex, global_string = n_) # tries to match `global_string = n_` pattern and bound the matched rhs into a variable `n`.
true

These changes aren't breaking but they're somewhat a big change, I'd like to minor version bump.

aviatesk commented 3 years ago

@MikeInnes can you please review this PR ? I really need these changes to make my package work, which makes a heavy use of @capture.