DIP25/DIP1000: My thoughts round 2
Chris M.
chrismohrfeld at comcast.net
Tue Sep 4 22:59:48 UTC 2018
On Tuesday, 4 September 2018 at 16:36:20 UTC, Nick Treleaven
wrote:
> Rust's lifetime syntax is noisy - the scope name is repeated,
> and why require a name if it's usually not given a meaningful
> one (`a`)?
>
> Rust is more limited semantically due to unique mutability, so
> it may have different requirements for function signatures to
> D. (I think they recently tweaked the rules on how lifetimes
> can be inferred).
As I was typing this up I was thinking about how Rust's rules
with how an object can be borrowed would affect it, but I can't
think of any examples off the top of my head.
>
> My syntax for parameters that may get aliased to another
> parameter is to write the parameter number that may escape it
> in its scope attribute:
>
> On Sunday, 2 September 2018 at 05:14:58 UTC, Chris M. wrote:
>> void betty(ref scope int*'a r, scope int*'a p) // okay it's
>> not pretty
>
> void betty(ref scope int* r, scope(1) int* p);
>
> p is documented as (possibly) escaped in parameter 1.
>
>> void betty(scope int*'a r, ref scope int*'a p)
>
> void betty(scope(2) int* r, ref scope int* p);
>
> I think my syntax is lightweight, clearer than Walter's
> `return` for void functions PR, but just as expressive as your
> examples.
I wouldn't disagree, it's much cleaner than what I had.
>
>> int*'a frank(scope int*'a p) { return p; } // basically id()
>
> I'd keep `return scope` for p.
That's true, it'd also allow your other syntax to be fitted over
retroactively.
>
> There's also:
>
> void swap(ref scope(2) T a, ref scope(1) T b);
>
> swap(r[0], r[1]);
>
> Arguments to a,b must have the same lifetime. Without support
> for this, we might need to use e.g. `swapAt(r, 0, 1)` instead
> of indexing throughout range algorithms.
That's a good example.
More information about the Digitalmars-d
mailing list