M
Modular6mo ago
Sören

Any way to work around that capturing closures cannot be materialized as runtime values?

I'm trying to implement converting data from an existing, possibly nested data structure into native Mojo collections like List, Dict etc. in a generic way. Here's an example for lists with one approach i've been trying:
@value
struct Column[T: CollectionElement]:
var getter: fn (v: Vector, length: Int, offset: Int) capturing -> List[T]

fn __init__[ChildType: CollectionElement](inout self: Column[List[ChildType]], child: Column[ChildType]):
"""Initialize a list column from a child column."""

fn list_getter(v: Vector, length: Int, offset: Int) capturing -> List[List[ChildType]]:
var l = List[List[ChildType]](capacity=length)
for idx in range(length):
l.append(child.get(v, length, offset + idx))
return l
self.getter = list_getter
# ...
fn get(self, v: Vector, length: Int, offset: Int) -> List[T]:
return self.getter(v, length, offset)
@value
struct Column[T: CollectionElement]:
var getter: fn (v: Vector, length: Int, offset: Int) capturing -> List[T]

fn __init__[ChildType: CollectionElement](inout self: Column[List[ChildType]], child: Column[ChildType]):
"""Initialize a list column from a child column."""

fn list_getter(v: Vector, length: Int, offset: Int) capturing -> List[List[ChildType]]:
var l = List[List[ChildType]](capacity=length)
for idx in range(length):
l.append(child.get(v, length, offset + idx))
return l
self.getter = list_getter
# ...
fn get(self, v: Vector, length: Int, offset: Int) -> List[T]:
return self.getter(v, length, offset)
The issue seems that list_getter needs to close over child in order to access it, but when I add capturing to the function, I get the following error:
TODO: capturing closures cannot be materialized as runtime values
TODO: capturing closures cannot be materialized as runtime values
The TODO seems to indicate that this might be supported in the future, but perhaps there's a way to work around the issue today? Any pointers appreciated.
6 Replies
ModularBot
ModularBot6mo ago
Congrats @Sören, you just advanced to level 2!
Martin Dudek
Martin Dudek4mo ago
Did you find a workaround for that? Facing the same limitation here. Thx
Sören
SörenOP4mo ago
@Martin Dudek unfortunately not. I went with a different design approach in the end.
ModularBot
ModularBot4mo ago
Congrats @Sören Brunk, you just advanced to level 3!
Martin Dudek
Martin Dudek4mo ago
thx
Manuel Saelices
Manuel Saelices4mo ago
I also found the same issue. With no global variables, the capturing closure is the only way I've found to be able to modify values in callbacks, for a event dispatcher pattern.

Did you find this page helpful?