On Tuesday, 13 May 2014 at 07:12:02 UTC, Marco Leise wrote:
Am Mon, 12 May 2014 08:44:51 +0000
schrieb "Marc Schütz" <schue...@gmx.net>:

On Monday, 12 May 2014 at 04:22:21 UTC, Marco Leise wrote:
> On the positive side the talk about Rust, in particular how
> reference counted pointers decay to borrowed pointers made me
> think the same could be done for our "scope" args. A > reference
> counted slice with 3 machine words could decay to a 2 machine
> word "scoped" slice. Most of my code at least just works on > the > slices and doesn't keep a reference to them. A counter > example
> is when you have something like an XML parser - a use case
> that D traditionally (see Tango) excelled in. The GC
> environment and slices make it possible to replace string
> copies with cheap slices into the original XML string.

Rust also has a solution for this: They have lifetime annotations. D's scope could be extended to support something similar:

     scope(input) string getSlice(scope string input);

or with methods:

     struct Xml {
         scope(this) string getSlice();
     }

scope(symbol) means, "this value references/aliases (parts of) the value referred to by <symbol>". The compiler can then make sure it is never assigned to variables with longer lifetimes than <symbol>.

Crazy shit, now we are getting into concepts that I have no
idea of how well they play in real code. There are no globals,
but threads all create their own call stacks with independent
lifetimes. So at that point lifetime annotations become
interesting.

I don't really know a lot about Rust, but I believe this is not an issue with Rust, as its variables are only thread-local. You can send things to other threads, but then they become inaccessible in the current thread. In general, lifetime annotations can only be used for "simple" relationships. It's also not a way to keep objects alive as long as they are referenced, but rather a way to disallow references to exist longer than the objects they point to.

Reply via email to