-
-
Notifications
You must be signed in to change notification settings - Fork 5.7k
Description
Julia allows for reflection.
It is infact really powerful. You can do crazy things like examine the code for a function programatically.
My issue is that it is largely based on unexported methods, and on directly reading various fields. Sometimes in complicated ways. Code based on this "privately" facing API breaks every single release.
Consider, this example that came up in code I am writing.
I would like to find out if a function has any methods that take a keyword arg with a given name.
function methods_with_kwarg(func::Function, kwarg_name::Symbol)
#BLACK-MAGIC, 0.5 only
supporting_methods = Method[]
ml = methods(func)
if isdefined(ml.mt, :kwsorter)
kwsort_t = typeof(ml.mt.kwsorter)
for mmm in ml.ms
sig = mmm.sig
all_kwarg_list = Base.kwarg_decl(sig, kwsort_t)
if kwarg_name ∈ all_kwarg_list
push!(supporting_methods, mmm)
end
end
end
supporting_methods
endjulia> methods_with_kwarg(repeat, :outer)
1-element Array{Method,1}:
- repeat(A::AbstractArray) at abstractarraymath.jl:329So in that code, 2 Public API method was used: methods and isdefined.
And then 5 private API methods/fields: MethodTable.kwsorter, Method.sig, MethodList.ms, MethodList.mt, and Base.kwarg_decl.
They are all undocumented. and I know they change in 0.6, and in 0.4, and 0.3.
It would be nice to be able to do reflection without having to go deep into the guts of the language.
Towards this end, I feel it is necessary to make a consideration of what reflection methods a language like julia should provide, and then define, export, and document methods to that end.