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);