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?
>>>
>>

Reply via email to