Skip to content

A publicly facing reflection API #20555

@oxinabox

Description

@oxinabox

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
end
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.

Metadata

Metadata

Assignees

No one assigned

    Labels

    featureIndicates new feature / enhancement requests

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions