Yikes, realized I forgot to announce the results on Friday. To evaluate the submissions, I tested each using a script that I executed from the linux prompt to ensure there weren’t differences in my typing at the REPL (since hitting certain keys can force the compilation of new methods). In a couple of cases, this led to a pretty different count than provided by the submitter, perhaps mostly because some REPL methods did not compile. (At least the rank order was consistent with the numbers provided by the applicants.)
Without further ado, here are the results of my analysis and the winners…
For the category of “pirating methods,” we had several submissions including a nail-biter for the win:
-
third place variants of overloading +:
- the original submission was
Base.:+(x::Int, y::Int) = Base.inferencebarrier(Base.add_int(x, y))(theinferencebarrierisn’t required ) by @simeonschaub at 15782 - an improved/more evil version
Base.:+(x::T, y::T) where {T<:Base.BitInteger} = Base.add_int(x, y)by @StefanKarpinski at 15933
- the original submission was
-
second place:
Base.getproperty(x, s::Symbol) = getfield(x, s)by @simonbyrne at 17035 -
first place
Base.convert(::Type{T}, x::Number) where T<:Real = T(x)by @tomerarnon at 17093
In the non-pirating category, we had:
-
second place
struct DoNotCare<:Real end; Base.:(==)(x::DoNotCare, ::Any) = trueby @oxinabox at 58 -
convertmethods:-
struct X end; Base.convert(::Any, ::X) = nothingby @oxinabox at 1666 was disqualified (sorry) because to be a validconvertmethod it should have beenBase.convert(::Type{Any}, ::X)(which has 1152 and would have won), so the winner is… -
first place
struct X end; Base.convert(::Union{}, ::X) = nothingby @mbauman at 903
-
In case you’re curious, in the non-pirating category I believe that it’s not currently possible to do better than the following rather arcane submission:
struct X end
Base._str_sizehint(::X) = nothing
at 2622 invalidations. You can discover this and similar opportunities by installing MethodAnalysis and then running demos/abstract.jl and typing mipriv on the command line. (mipriv means “MethodInstances of private, a.k.a. non-exported, names”; the analog for exported names is miexp).
Congrats to the winners, and let the second phase commence! Announcement will likely be made on Saturday as I am reserving Friday afternoon for a family bike trip.