I want to write a macro that performs certain actions before and after
an expression, returning the value of the expression. Here is my first
try:
macro wrap(expr)
:(global a=1;
r = $(esc(expr));
global a=0;
r)
end
Obviously, setting the global variable `a` to 1 and 0 are just
placeholder actions.
This works for expressions, but doesn't work when `return` statements
are involved.
julia> @wrap 3
3
julia> @wrap (if true return 3 else 0 end)
ERROR: syntax: misplaced return statement
This simpler case demonstrates the problem:
julia> @wrap (return 3)
=> ERROR: syntax: misplaced return statement
The problem goes away if I don't try to conserve the result into a
variable `r`. However, I really need to do that. How?
-erik
PS: The macro `@inbounds` in Base has the same issue -- I assume this
is the reason why it doesn't return a value.
--
Erik Schnetter <[email protected]>
http://www.perimeterinstitute.ca/personal/eschnetter/