There is some discussion on invoke on github: https://github.com/JuliaLang/julia/pull/13123 maybe you want to weight in.
On Tue, 2016-06-28 at 19:19, 'Bill Hart' via julia-users <julia-users@googlegroups.com> wrote: > You are a life saver. This is *precisely* what we need. Thank you for > solving a very difficult problem for us. We were really pulling our hair > out after searching for a solution. > > julia> module Nemo > import Base: det > abstract MatElem > function det(a::MatElem) > return 1 > end > type nemomat <: MatElem > end > export nemomat > export det > end > Nemo > > julia> module Hecke > using Nemo > import Nemo.det > type SpecialMat <: Nemo.MatElem > data::Int > end > function det(a::SpecialMat) > if a.data == 4 > return 3 > else > return invoke(det, (Nemo.MatElem,), a) > end > end > export SpecialMat > export det > end > Hecke > > julia> using Hecke > > julia> s = SpecialMat(3) > Hecke.SpecialMat(3) > > julia> t = SpecialMat(4) > Hecke.SpecialMat(4) > > julia> det(s) > 1 > > julia> det(t) > 3 > > Let's help search engines with this, since we were unable to find anything, > and it is such an important issue: > > trouble extending a Base function in Julia > How do I call a specific version of a function in Julia for specific types > How do I call a more general version of a function in Julia > How do I call a less specific version of a function in Julia > How do I call a specific method in Julia > method to apply a function in Julia > invoking a given version of a function in Julia > > To the Julia devs: please, please don't remove this functionality! > > Bill. > > On Tuesday, 28 June 2016 18:40:27 UTC+2, Rafael Fourquet wrote: >> >> I'm far from expert on those questions, but would the "invoke" function >> work? >> I think it's considered to be a tool of the last resort, but seems to >> be the situation you are in! >> >> invoke(f, (types...), args...) >> >> Invoke a method for the given generic function matching the >> specified types (as a tuple), on the specified arguments. The >> arguments must be compatible with >> the specified types. This allows invoking a method other than the >> most specific matching method, which is useful when the behavior of a >> more general >> definition is explicitly needed (often as part of the implementation >> of a more specific method of the same function). >>