Ich habe im Grunde durch alle Julia Dokumentation gegraben, aber ich kann keine Antworten zu diesem finden. Meine Frage kann in zwei Teile geteilt werden. Code-Snippets ignorieren Dinge wie die Initialisierung von Basic.Boxing/Unboxing komplexe Typen in Julia
Teil 1: Wie Grund komplexe Typen zu übergeben, ohne jl_eval_string()
Angenommen, ich eine C/C++ Programm, das einige Julia Skripte aufruft, für eine Funktion, die eine gewisse f
String
Manipulation zu tun. In der C-Quelle:
char* parameter_string; // Initialized as something.
jl_module_t *m = (jl_module_t *) jl_load("Script.jl");
jl_function_t *f = jl_get_function(m, "f");
jl_value_t * ret = jl_call1(f, /*???*/) <--- Problem
Nun beachtet, dass das Handbuch beschreibt nur, wie Primitive Feld, wie int, float, double. Nichts über komplexe Typen wie String
. Ja, ich kann jl_eval_string(parameter_string)
verwenden, aber ich mag das nicht. Darüber hinaus wird ret
ein String sein, und ich habe keine Ahnung, wie man es zu C extrahiert. Es ist undokumentiert.
Teil 2:
Angenommen, ich ein C/C++ Programm, das einige Julia Skripte aufruft, in dem eine Zustandsmaschine abgestuft ist. Um eine Zustandsmaschine zu erstellen, erstellen ich einige Typen:
abstract State
type Idle <: State end
type State1 <: State end
type State2 <: State end
Und dann eine Übergangsfunktion:
function transition(s :: State, input :: String) # input :: String is arbitrary
.. Do Something ..
return newState
end
Nun, wenn ich einen State
erstellen möchten, sagen Idle
, in C ... I kann so etwas nicht finden, geschweige denn einen Weg finden, es von Julia zurückzuholen.
Ich nähere dieses Problem mehr oder weniger wie funktionale Programmiersprache, wie Haskell, Scala oder F #. Algebraischer Datentyp wird hier möglicherweise nicht gut unterstützt, aber ich denke, es ist immer noch besser, als es mit Ganzzahlen zu codieren.
Das eigentliche Problem ist, dass ich keine C-API-Dokumente auf Julia finden kann, ohne direkt in den Quellcode zu graben.
OK, ich verstehe. BTW, ich bin nicht so vertraut mit Julias Typsystem, also bin ich mir nicht sicher, ob diese ADT-ähnliche Struktur tatsächlich funktioniert –
Und was ist mit dem Abrufen? Ist es so etwas wie Ret-> Typ? Oder ist es 'jl_valueof()' und 'jl_typeof()'? Sie sind Makros, also kenne ich ihren Typ nicht wirklich. –
Ja, Sie können den Typ eines 'jl_value_t *' mit 'jl_typeof()' ermitteln. Der 'jl_value_t *' selbst zeigt bereits auf den Datenbereich (nach dem Typ-Tag). –