-
-
Notifications
You must be signed in to change notification settings - Fork 5.5k
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
added @macroexpand
#18660
added @macroexpand
#18660
Changes from 1 commit
988f7a1
bff375b
0b2c3ca
2dfe407
691052d
ebe9b53
c66c096
f8157dc
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -1052,6 +1052,7 @@ export | |
expand, | ||
gensym, | ||
macroexpand, | ||
@macroexpand, | ||
parse, | ||
|
||
# help and reflection | ||
|
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -61,6 +61,16 @@ Takes the expression `x` and returns an equivalent expression with all macros re | |
""" | ||
macroexpand(x::ANY) = ccall(:jl_macroexpand, Any, (Any,), x) | ||
|
||
""" | ||
@macroexpand | ||
|
||
Return equivalent expression with all macros removed (expanded). | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. It should be documented that the expansion happens in the module where the julia> module M
macro macroexpand(code)
QuoteNode(macroexpand(code))
end
macro m()
1
end
function f()
(@macroexpand(@m), macroexpand(:(@m)))
end
end
M
julia> macro m()
2
end
@m (macro with 1 method)
julia> M.f()
(1,2) This makes no difference when used in the REPL and as I said the current There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Can you give a usecase this would actually make a difference? And why is There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
That's exactly what the code above is showing.
I said
|
||
""" | ||
macro macroexpand(code) | ||
code_expanded = macroexpand(code) | ||
Expr(:quote, code_expanded) | ||
end | ||
|
||
## misc syntax ## | ||
|
||
""" | ||
|
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,18 @@ | ||
|
||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Why is this in a new file? This can probably go to |
||
# @macroexpand tests | ||
macro seven_dollar(ex) | ||
# simonbyrne example 18240 | ||
isa(ex,Expr) && ex.head == :$ ? 7 : ex | ||
end | ||
|
||
let | ||
@test (@macroexpand @macroexpand x) == macroexpand(:(@macroexpand x)) | ||
@test (@macroexpand :(1+$y) ) == macroexpand(:( :(1+ $y))) | ||
@test (@macroexpand @fastmath 1+2 ) == :(Base.FastMath.add_fast(1,2)) | ||
@test (@macroexpand @fastmath + ) == :(Base.FastMath.add_fast) | ||
@test (@macroexpand @fastmath min(1) ) == :(Base.FastMath.min_fast(1)) | ||
@test (@macroexpand @doc "" f() = @x) == Expr(:error, UndefVarError(Symbol("@x"))) | ||
@test (@macroexpand @seven_dollar $bar) == 7 | ||
x = 2 | ||
@test (@macroexpand @seven_dollar 1+$x) == :(1 + 2) | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Is this actually the correct behaviour? Shouldn't it throw an error? There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. You are right!
code_expanded looks good the problem is the eval call on Expr(:quote, code_expanded) which does $ interpolation. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. So would the solution be to search and quote the dollars expressions in code_expanded? There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I'm honestly not sure. This stuff always makes my head hurt. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I think correct behaviour would be not to throw an error but return something like There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Yeah my head hurts, too. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Maybe it would be better to print the result, rather than return it, i.e. do:
After all, that's probably what you want in 99% of cases. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 👎 to print it. macro macroexpand(code)
QuoteNode(macroexpand(code))
end There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Is There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. It should be. |
||
end |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
missing indent, and would have to be added to rst if this gets merged before #18588
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
where do I have to add it to rst?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
done