Oh cool, did not know! Thank you! (I'm very new to Julia, sorry)
For anyone else looking for this, here's a function that strips metadata
(so far just LineNumberNodes) from Exprs so you can compare them.
function stripmeta(expr)
println(typeof(expr))
if isa(expr, Expr)
return Expr(expr.head, stripmeta(expr.args)...)
elseif isa(expr, Array)
return map(stripmeta, filter(x -> !isa(x, LineNumberNode), expr))
else
return expr
end
end
All of the tests work as expected now:
Expr(:if, true, Expr(:block, 0), Expr(:block,1)) == :(if true 0 1) --> TRUE
:) Thanks!
On Wednesday, December 9, 2015 at 2:15:25 PM UTC-8, Yichao Yu wrote:
>
> On Wed, Dec 9, 2015 at 5:12 PM, <[email protected] <javascript:>>
> wrote:
> > sorry ok, I see - it's
> > Expr.head
> > and
> > Expr.args
> >
> > Man, I really wish Julia had something like python's help(Expr) to see
> all
> > the methods/fields of a class...
> >
>
> ```
> help?> Expr
> search: Expr export nextprod expanduser expm exp2 exp expm1 exp10
> expand exponent
>
> No documentation found.
>
> Summary:
>
> type Expr <: Any
>
> Fields:
>
> head :: Symbol
> args :: Array{Any,1}
> typ :: Any
> ```
>
> >
> > On Tuesday, December 8, 2015 at 8:26:35 PM UTC-8, [email protected]
> wrote:
> >>
> >> Situations where the printed form of an expression (i.e, what you'd
> type
> >> into julia REPL, for example) are equivalent aren't "equal" per julia's
> >> standards:
> >>
> >> Expr(:call, :<, 1, 2) --> :(1 < 2)
> >> Meta.show_sexpr(:(1 < 2)) --> (:comparison, 1, :<, 2)
> >> Expr(:call, :<, 1, 2) == :(1 < 2) --> FALSE
> >>
> >> I figure that's expected because the s-expressions behind the scenes
> >> aren't accurate.
> >> So the workaround is:
> >>
> >> Expr(:call, :<, 1, 2) == :(<(1,2)) --> TRUE
> >>
> >> This isn't ideal, but at least there's a way to express the Expr object
> I
> >> want in terms of julia's syntax.
> >> Is there another way to make these two semantically equivalent
> >> representations actually be equal?
> >>
> >> Second - a much weirder problem:
> >>
> >> Meta.show_sexpr(:(symbol.x())) --> (:call, (:., :symbol, (:quote, :x)))
> >>
> >>
> >> Ok, so make an expression:
> >>
> >> Meta.show_sexpr(Expr(:call, Expr(:., :symbol, Expr(:quote, :x)))) -->
> >> (:call, (:., :symbol, (:quote, :x)))
> >>
> >>
> >> Cool. So this time the expression object and the actual julia
> >> representation are the exact same.
> >>
> >> However:
> >>
> >> Expr(:call, Expr(:., :symbol, Expr(:quote, :x))) == :(symbol.x()) -->
> >> FALSE
> >>
> >>
> >> And stragely
> >>
> >>
> >> Meta.show_sexpr(Expr(:call, Expr(:., :symbol, Expr(:quote, :x)))) ==
> >> Meta.show_sexpr(:(symbol.x())) --> TRUE
> >>
> >>
> >> What is going on!? And how do I get these expressions to agree?
> >>
> >>
> >> Vishesh
> >>
> >>
> >>
> >>
> >>
> >
>