@oxinabox , noted paragon of virtue , has done some amazing work for the ecosystem making tools for reflection, but those tools rely on internals.
She has had this issue open for 7 years:
opened 02:27AM - 10 Feb 17 UTC
kind:feature
Julia allows for reflection.
It is infact really powerful. You can do crazy thi… ngs [like examine the code for a function programatically](http://stackoverflow.com/a/39305272/179081).
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.
```julia
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
end
```
```julia
julia> methods_with_kwarg(repeat, :outer)
1-element Array{Method,1}:
- repeat(A::AbstractArray) at abstractarraymath.jl:329
```
So 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.
Does anyone have a sense of if this has languished due to disagreement on the API, disinterest in exposing an API at all, or just time to implement a solution?
2 Likes
Opened a small PR to take a swing at this:
JuliaLang:master
← mrufsvold:master
opened 03:42PM - 10 May 24 UTC
This PR documents `Method`, `MethodList`, and a few functions for retrieving the… properties of a `Method`. `methods` is partially documented but isn't very useful outside of interactive sessions because nothing it returns is public. The docs are also currently incorrect because they claim that `methods` returns a `MethodTable`, but it actually returns a `MethodList`.
This partially addresses #20555, but I am intentionally keeping the surface area of this change very small so to judge the interest in this direction. To that end, I do not document `MethodTable`, anything to do with kwargs, nor do I define functions to access any of the more "advanced" properties of `Method`.
This is my first time contributing, so I don't have tooling set up to test building the docs. There is still a lot of clean up to do with regard to adding tests for the new functions, but I want an initial reaction from the maintainers about this PR before burning more time.
5 Likes