2017-07-31 1 views
1

Comment puis-je accéder à une méthode d'une fonction Julia dans l'API C de Julia? Il y a des structs jl_method_instace_t et jl_method_t qui, je suppose, sont censés être des conteneurs pour les méthodes de Julia au niveau C, mais comment peut-on en construire un? Et comment peut-on obtenir une méthode spécifique d'une fonction abstraite.Obtenir la méthode Julia spécifique en C

+1

C ne prend pas en charge _methods_. Et _functions_ n'ont pas de _methods_. – Olaf

+0

La documentation de Julia contient un chapitre sur l'intégration de Julia dans C, c'est-à-dire l'appel des fonctions de Julia à partir de C, mais elle ne fait aucune mention de 'jl_method_instance_t' ni de' jl_method_t'. –

+1

Il y a une fonction jl_invoke exportée dans julia.h qui devrait être utilisée pour invoquer les méthodes Julia, étant donné un tableau de jl_value_t *. Mais il ne semble pas y avoir d'interface pour construire jl_method_instance_t * dans Julia même, à partir des fonctions génériques de Julia (avec une liste de types). Donc, je suis sûr qu'il demande comment générer jl_method_instance_t de Julia afin qu'ils puissent être jl_invoked sur le côté C. Ceci n'est évidemment pas documenté, actuellement, d'où la question. – Bill

Répondre

1

J'ai une réponse partielle. Vous pouvez obtenir une méthode spécifique en appelant la fonction "which".

julia> f = which(+, (Int, Int)) 
+{T<:Union{Int128,Int16,Int32,Int64,Int8,UInt128,UInt16,UInt32,UInt64,UInt8}}(x::T, y::T) at int.jl:32 

julia> typeof(f) 
Method 

Je ne sais pas comment « Unbox » (pas sûr de la terminologie), la jl_value_t correspondante * pour f du côté C pour obtenir un jl_method_t *. Mais je pense que cela vous mène à mi-chemin.

Je suppose que c'est le mieux que vous puissiez faire, car les spécialisations semblent n'exister que si la fonction a déjà été appelée (et donc Jit compilée), pour cet ensemble d'arguments.

Je ne suis pas sûr de ce qu'est un jl_method_instance_t.

+1

Apparemment, dans Julia 0.6, on peut créer un 'jl_method_instance_t' en utilisant' jl_get_specialized'. Malheureusement, cette fonction n'est pas exposée dans la bibliothèque Julia. – sebigu