What is correct form in this case?
The exact same problem again: you need to *quote* the returned expression
from the macro, to make sure that the code is run when the macro is called,
and not when it’s defined.
This will work as intended:
macro tst(i::Int)
quote
tst3(i)
end
end
# or
macro tst(i::Int)
:(tst3(i))
end
This section of the manual
<http://docs.julialang.org/en/release-0.4/manual/metaprogramming/> might be
worth reading (again) :)
// T
On Monday, September 28, 2015 at 7:20:03 AM UTC+2, Leonardo wrote:
Many thanks!
>
> I have a similar problem calling a function in following scenario:
> function tst3(i::Int)
> println(i)
> end
>
> macro tst(i::Int)
> tst3(i)
> end
>
> I obtain an error executing code:
> julia> b = 2::Int
> julia> @tst b
> complaining for a problem of type, because tst3 seems to receive a Symbol
> instead an Integer:
> ERROR: TypeError: anonymous: in typeassert, expected Int64, got Symbol
>
> What is correct form in this case?
>
> Leonardo
>
>
> Il 27/09/2015 18:58, Yichao Yu ha scritto:
>
> On Sun, Sep 27, 2015 at 12:20 PM, Leonardo <[email protected]> <javascript:>
> wrote:
>
> Hi all,
> I need manipulate AST of an expression in a macro, and pass same expression
> in input to another macro, but I experience some problem.
>
> I try to express my doubt with a simplified example:
> macro tst2(e2::Expr)
> println(e2.head)
> end
>
> macro tst(e1::Expr)
> @tst2 esc(e1)
> end
>
> ```
> macro tst(e1::Expr)
> quote
> @tst2 $(esc(e1))
> end
> end
> ```
>
> otherwise, `@tst2` will be run at `tst` definition time.
>
>
> In previous code I want that call to @tst2 behave exact like call to @tst.
>
> E.g. calling @tst2 in REPL I obtain:
> julia> a = 2
> julia> @tst2(a < 3)
> comparison
> but same call to @tst has no effect, and I cannot find an alternative
> working form for @tst
>
> Someone can help me to understand this odd behaviour of Julia's macro?
>
> Many thanks in advance
>
> Leonardo
>
>
>
>