Create named tuple in C to pass to jl_call

I’m embedding Julia in C and I would like to be able to create named tuples with the number of filelds, their names and types being determined at runtime.
I am currently able to create a standard tuple like this:

jl_value_t *types[3] = {(jl_value_t *) jl_float64_type, 
                        (jl_value_t *) jl_int64_type,
                        (jl_value_t *) jl_int64_type};
jl_tupletype_t *tt = jl_apply_tuple_type_v(types, 3);

jl_value_t *tup_values[3] = {(jl_value_t *) jl_box_float64(2.2), 
                             (jl_value_t *) jl_box_int64(2), 
                             (jl_value_t *) jl_box_int64(3)};

jl_value_t *tuple = jl_new_structv(tt, tup_values, 3);

How could I also include the field names in the tuple object, so as to create a named tuple instead?

jl_value_t *names[3] = {(jl_value_t *) jl_cstr_to_string("key1"), 
                        (jl_value_t *) jl_cstr_to_string("key2"), 
                        (jl_value_t *) jl_cstr_to_string("key3")};     

Thank you very much.

1 Like

Bump. Documentation on this is very scarce, and the only proposed alternative is “use @cfunction

This is some very bad written code. But I finally found a way. Someone more expert than me probably can improve it and shorten it, but I leave here the pseudo code for future ref. Also, if possible please improve documentation on this.

jl_datatype_t *NamedTupleT = (jl_datatype_t*)jl_get_global(jl_base_module, jl_symbol("NamedTuple"));

jl_value_t *keys = jl_eval_string("(:n1, :n2)");

jl_value_t *values_array[N];
values_array[0] = jl_cstr_to_string("some string");  
...
jl_value_t *values = jl_apply_tuple_type_v(values_array, N);

jl_value_t *tuple_types[N];
tuple_types[0] = (jl_value_t*)jl_string_type;
...
jl_value_t *tuple_type = jl_apply_tuple_type_v(tuple_types, N);

jl_value_t *namedtuple_params[2] = {keys, tuple_type};
jl_value_t *namedtuple_type = jl_apply_type(NamedTupleT, namedtuple_params, 2);

jl_value_t *namedtuple_value = jl_new_structv((jl_datatype_t*)namedtuple_type, values_array, N);

jl_function_t *kwfunc = jl_call1(jl_get_function(jl_core_module, "kwfunc"), (jl_value_t*)your_fcn);
jl_value_t *argsave[posN + 1] = {namedtuple_value, (jl_value_t*)your_fcn, /*pos_values here*/};

jl_call(kwfunc, argsave, posN + 1);