MacroTools.jl
MacroTools.jl copied to clipboard
provides ways to circumvent unexpected type bindings
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.
@MikeInnes can you please review this PR ? I really need these changes to make my package work, which makes a heavy use of @capture.