Sorry, just to be clear:
*julia> **show(:(macro m(x) :($x) end))*
macro m(x)
$(Expr(:quote, :($(Expr(:$, :x)))))
end
On Saturday, January 23, 2016 at 4:28:49 PM UTC-8, [email protected]
wrote:
>
> Ok, I tried to do that:
>
> import Base.show
> function show(e::Expr)
> if e.head == :macro
> e.head = :function
> print("macro")
> print(@sprintf("%s", stripmeta(e))[9:end])
> e.head = :macro
> nothing
> elseif e.head == :$
> print("\$(")
> for a in e.args
> show(a)
> end
> print(")")
> else
> show(e)
> end
> end
>
> I thought that show would be defined recursively on functions, but it
> seems that's not the case, since trying to print :(macro m(x) :(x) end)
> gives me $(Expr(:quote, :($(Expr(:$, :x))))).
> How would I get around this?
>
> On Monday, January 18, 2016 at 6:14:42 AM UTC-8, Ismael Venegas Castelló
> wrote:
>
>> That's because in the case of expressions, we are interested in the AST,
>> show representation is just an abstraction of that, there is also dump and
>> xdump:
>>
>> julia> ex = :(:($x))
>> :($(Expr(:quote, :($(Expr(:$, :x))))))
>>
>> julia> Meta.show_sexpr(ex); println()
>> (:quote, (:$, :x))
>>
>> julia> dump(ex)
>>
>> Expr
>> head: Symbol quote
>> args: Array(Any,(1,))
>> 1: Expr
>> head: Symbol $
>> args: Array(Any,(1,))
>> 1: Symbol x
>> typ: Any
>> typ: Any
>>
>> julia> ex.args[1].args[1] = :y
>> :y
>>
>> julia> ex
>> :($(Expr(:quote, :($(Expr(:$, :y))))))
>>
>> julia> Meta.show_sexpr(ex); println()
>> (:quote, (:$, :y))
>>
>> julia> dump(ex)
>> Expr
>> head: Symbol quote
>> args: Array(Any,(1,))
>> 1: Expr
>> head: Symbol $
>> args: Array(Any,(1,))
>> 1: Symbol y
>> typ: Any
>> typ: Any
>>
>> You could overwrite those methods or write your own that prints them the
>> way you want to.
>>
>> El domingo, 17 de enero de 2016, 1:50:05 (UTC-6), [email protected]
>> escribió:
>>>
>>> Hi!
>>>
>>> Was messing around with exceptions, and trying to see under the hood and
>>> construct macro expressions.
>>>
>>> Eg, Meta.show_sexpr(:(:(+ 1 2))) -> (:quote, (:call, :+, 1, 2))
>>>
>>> but how do you build an unquote expression?
>>>
>>> Meta.show_sexpr(:(:($(x+5) + 1))) -> (:quote, (:call, :+, (:$, (:call,
>>> :+, :x, 5)), 1))
>>>
>>>
>>> But Expr(:quote, Expr(:call, :+, Expr(:$, Expr(:call, :+, :x, 5)), 1))
>>> -> :($(Expr(:quote, :($(Expr(:$, :(x + 5))) + 1))))
>>>
>>> In other words, it's not processing into the appropriate expression, and
>>> there's some weird intermediate syntax going on.
>>>
>>>
>>> How does one build an unquote expression? I.e, an expression that would
>>> eval to unquoting a variable?
>>>
>>