Open oxinabox opened 7 years ago
We should start with a list of this public and private methods/fuelds. Then change the short cryptic names and document everything even if not exported, so we can suggest how the API should look like. I didnt know about those private methods.
So that implementation can change, all fields basically require functions,
that retrieve their value.
Eg. paramaters(T) = T.parameters
I think this needs a (short or advanced) plan for 1.0/1.x at list for the publicly facing part.
I'll list some reflection uses I found for fields reflection (not listing the most common patterns that involve testing and documenting in repl and in compiled docs).
julia (cholmod.jl):
let offset = fieldoffset(C_Sparse{Float64}, findfirst(name -> name === :stype, fieldnames(C_Sparse{Float64})))
gadfly (chain method)
for name in fieldnames(Data)
#more code
getfield(data, name)
#more code
Cxx.jl:
vals = [llvmconst(getfield(val,i)) for i = 1:length(fieldnames(T))]
another I want is
argnames(::Method)
, which has a nonexported API at https://github.com/JuliaLang/julia/blob/d519b5bf43070f174a6895802042f86f02af5bd8/base/methodshow.jl#L45
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.
So in that code, 2 Public API method was used:
methods
andisdefined
. And then 5 private API methods/fields:MethodTable.kwsorter
,Method.sig
,MethodList.ms
,MethodList.mt
, andBase.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.