Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

provides ways to circumvent unexpected type bindings #160

Open
wants to merge 1 commit into
base: master
Choose a base branch
from

Conversation

aviatesk
Copy link
Contributor

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
Copy link
Contributor Author

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

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
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
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.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

1 participant