The Power of Lifetimes
pling.jondgoodwin.com
pling.jondgoodwin.com
This is already expressible in Rust, using invariant lifetimes. You can hand someone an opaque invariant lifetime, let them build a mutable cyclic data structure with it, and then pass that data structure around.
This use of invariant lifetimes, called "generativity," is described in more detail here (https://raw.githubusercontent.com/Gankro/thesis/master/thesi...) in section 6.3, which describes a way to use lifetimes as unique tokens for all sorts of use cases.
And even more closely aligned with what the article is talking about, Catherine West has put together a library that uses generativity to provide a safe interface to a garbage collected heap, as part of a reimplementation of Lua: the `gc-arena` crate in https://github.com/kyren/luster
int* foo() {
int i;
int* p = &i;
int* q = p;
return q;
}
is detected as an error. This tracking is even done across function calls: int* bar(scope int *p); // p doesn't escape bar()
int* abc(return scope int* p); // p doesn't
// escape abc() but is returned from it
int* foo() {
int i;
return bar(&i); // ok
return abc(&i); // error
}
The annotations can be explicit, or can be inferred by the compiler by analyzing the function bodies.(I don't know much about dlang. I got the compiler flags from googling and happening upon the test case in this PR https://github.com/dlang/dmd/pull/8504/files#diff-bb6a3ed8a5... )
test.d(9): Error: reference to local variable s assigned to non-scope s.i