Le jeudi 27 août 2015 à 09:13 +0300, Joshua Ballanco a écrit :
> On August 26, 2015 at 21:30:47, Yichao Yu ([email protected](mailto:
> [email protected])) wrote:
> > On Wed, Aug 26, 2015 at 12:44 PM, Sisyphuss 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...) 
> > ... 
> > ``` 
> 
> 
> Agreed, but if you reference the function being overwritten before
> assigning a new definition, at least you get a warning:
> 
> ```
> julia> typeof(esc(+))
> Expr
> 
> julia> + = 1
> WARNING: imported binding for + overwritten in module Main
> 1
> ```
> 
> and in the original case:
> 
> ```
> julia> abstract B
> 
> julia> type A <: B end
> 
> julia> type C <: B end
> 
> julia> promote_rule
> promote_rule (generic function with 124 methods)
> 
> julia> promote_rule(::Type{A}, ::Type{C}) = C
> ERROR: error in method definition: function Base.promote_rule must be
> explicitly imported to be extended
> ```
> 
> It would be nice if a user could get those warnings without having to
> reference the function first.
Maybe overwriting functions from Base should always trigger a warning?
Or at least for some essential functions?


Regards

Reply via email to