2017-05-10 2 views
0

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

Antwort

4

Sie können eine C-Zeichenfolge in eine Julia String mit jl_cstr_to_string(char*) konvertieren.

Um die Daten von einer Julia String zu erhalten, verwenden Sie jl_string_ptr(jl_value_t*).

Konstruktoren werden genau wie Funktionen aufgerufen. Um einen Konstruktor aufzurufen, können Sie jl_get_function(m, "Idle") verwenden und wie üblich aufrufen. Oder, um ein Objekt direkt zuzuweisen (um irgendwelche Konstruktoren herumzulaufen, die möglicherweise technisch so gefährlich sind), können Sie jl_new_struct(type, fields...) aufrufen.

+0

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 –

+0

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

+0

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). –

Verwandte Themen