# Create named tuple in C to pass to jl\_call

**URL:** <https://discourse.julialang.org/t/create-named-tuple-in-c-to-pass-to-jl-call/63547>\
**Category:** New to Julia\
**Tags:** question, embedding\
**Created:** [June 25, 2021, 12:52pm UTC](https://discourse.julialang.org/t/create-named-tuple-in-c-to-pass-to-jl-call/63547 "2021-06-25T12:52:19Z")\
**Posts on this page:** 3\
**Page:** 1

<div class="post-metadata">

**Author:** ![kkaravokyri](https://avatars.discourse-cdn.com/v4/letter/k/3be4f8/32.png) [@kkaravokyri](https://discourse.julialang.org/u/kkaravokyri)\
**Post date:** [June 25, 2021, 12:52pm UTC](https://discourse.julialang.org/t/create-named-tuple-in-c-to-pass-to-jl-call/63547/1 "2021-06-25T12:52:19Z")

</div>

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:

```julia
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?

```julia
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.

---

<div class="post-metadata">

**Author:** ![Eventine](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/eventine/32/215272_2.png) [@Eventine](https://discourse.julialang.org/u/Eventine)\
**Post date:** [March 4, 2025, 12:04pm UTC](https://discourse.julialang.org/t/create-named-tuple-in-c-to-pass-to-jl-call/63547/2 "2025-03-04T12:04:39Z")

</div>

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

---

<div class="post-metadata">

**Author:** ![Eventine](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/eventine/32/215272_2.png) [@Eventine](https://discourse.julialang.org/u/Eventine)\
**Post date:** [March 4, 2025, 2:29pm UTC](https://discourse.julialang.org/t/create-named-tuple-in-c-to-pass-to-jl-call/63547/3 "2025-03-04T14:29:56Z")

</div>

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.

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

```
