I tried your example. Really, you can break Julia in this way. Luckily, 
it's a syntax error.

However, mine is a semantic error, and harder to detect.


On Wednesday, August 26, 2015 at 8:30:47 PM UTC+2, Yichao Yu wrote:
>
> On Wed, Aug 26, 2015 at 12:44 PM, Sisyphuss <[email protected] 
> <javascript:>> wrote: 
> > Of course, I know how to write the valid code. 
> > 
> > But in the interactive environment, if someone accidentally defines the 
> > promote_rule in the non-base way, he will find himself in an 
> > incomprehensible situation. 
>
> There's too many things you can accidentally do to break normal 
> functions in current scope and I don't think this one is particularly 
> bad. 
>
> ``` 
> julia> + = 1 
> 1 
>
> julia> 1 + 2 
> ERROR: MethodError: `call` has no method matching call(::Int64, 
> ::Int64, ::Int64) 
> Closest candidates are: 
>  Union(::Any...) 
>  BoundsError(::Any...) 
>  TypeVar(::Any...) 
>  ... 
> ``` 
>
> > 
> > 
> > On Wednesday, August 26, 2015 at 4:15:59 PM UTC+2, Luthaf wrote: 
> >> 
> >> By doing 
> >> 
> >>     promote_rule() = 1 
> >> 
> >> And then 
> >> 
> >>     Base.promote_rule{T}(::Type{A{T}},::Type{C{T}}) = C{T} 
> >> 
> >> You are defining two different functions. Only the second one is used 
> by 
> >> the promotion system. 
> >> 
> >> The valid code is 
> >> 
> >>     abstract B 
> >>     type A<:B 
> >>     end 
> >> 
> >>     type C<:B 
> >>     end 
> >> 
> >>     Base.promote_rule(::Type{A},::Type{ C}) = C 
> >> 
> >>     @assert promote_type(A,C) == C 
> >> 
> >> Sisyphuss a écrit : 
> >> 
> >> In other words, it "won't fix"? 
> >> 
> >> On Wednesday, August 26, 2015 at 6:41:36 AM UTC+2, Stefan Karpinski 
> wrote: 
> >> 
> >> Don't do the first non-base definition. 
> >> 
> >> On Wed, Aug 26, 2015 at 12:27 AM, Sisyphuss <[email protected]> 
> wrote: 
> >> 
> >> This modification works, but it fails sometimes: 
> >> 
> >> abstract B{T} 
> >> 
> >> type A{T}<:B{T} 
> >> end 
> >> 
> >> type C{T}<:B{T} 
> >> end 
> >> 
> >> promote_rule() = 1 
> >> promote_rule() 
> >> @assert promote_type(A{Real},C{Real}) == B{Real} 
> >> 
> >> Base.promote_rule{T}(::Type{A{ T}},::Type{C{T}}) = C{T} 
> >> @assert promote_type(A{Real},C{Real}) == B{Real} 
> >> @assert promote_type(A{Int},C{Int}) == C{Int} 
> >> 
> >> The behavior of `promote_rule` for the abstract parametric type is 
> >> disrupted by the earlier weird non-Base `promote_rule`. (Environment: 
> >> JuliaBox) 
> >> 
> >> By the way, why I can define `promote_rule`, but when I try to define 
> >> `promote_type`, it raises an error? 
> >> 
> >> 
> >> 
> >> 
> >> On Wednesday, August 26, 2015 at 5:25:50 AM UTC+2, Tim Holy wrote: 
> >> 
> >> Add `Base.` in front of `promote_rule`. 
> >> 
> >> --Tim 
> >> 
> >> On Tuesday, August 25, 2015 08:23:40 PM Sisyphuss wrote: 
> >> > abstract B 
> >> > 
> >> > type A<:B 
> >> > end 
> >> > 
> >> > type C<:B 
> >> > end 
> >> > 
> >> > promote_rule(::Type{A},::Type{ C}) = C 
> >> > 
> >> > @assert promote_type(A,C) == B 
> >> > 
> >> > Whether I define the promotion_rule or not, the promote_type is 
> always 
> >> > B. 
> >> 
> >> 
> > 
>

Reply via email to