> What is Expr(:<:, :X, :Int) supposed to mean?

It's part of a function definition:

:(f{X<:Int}(x::X) = 5).args[1].args[1].args[2]

I came across this when doing unit testing for a function which picks a
function definition apart:

julia> parsef(fn) = fn.args[1].args[1].args[2]
parsef (generic function with 1 method)

julia> fn = :(f{X<:Int}(x::X) = 5)
:((f{X<:Int})(x::X) = 5)

julia> parsef(fn)
:(X<:Int)

julia> @test parsef(fn)==:(X<:Int)
ERROR: test failed: (X<:Int == X <: Int)

julia> @test parsef(fn)==Expr(:<:, :X, :Int)
# passes test

>
> I just get an AST error when trying to evaluate that expression, so it 
> can't be very usefull
>
> julia> eval(Expr(:<:, :Int64, :Int)) 
> ERROR: unsupported or misplaced expression <:
>
> We should probably consider erroring out when printing invalid expressions.
>
> Regards
> Ivar
>
> kl. 11:05:34 UTC+2 tirsdag 21. oktober 2014 skrev Mauro følgende:
>>
>> This seems a bit confusing: 
>>
>> ``` 
>> julia> Expr(:<:, :X, :Int) 
>> :(X<:Int) 
>>
>> julia> Expr(:<:, :X, :Int).head 
>> :<: 
>>
>> julia> :(X<:Int) 
>> :(X <: Int) 
>>
>> julia> :(X<:Int).head 
>> :comparison 
>> ``` 
>>
>> Is this intentional?  This also means that copy-pasting the string 
>> representation of `Expr(:<:, :X, :Int)` does not yield itself. 
>>

Reply via email to