I am excited about the new marker types! I think that, combined with a fix
for issue 5121 (https://github.com/mozilla/rust/issues/5121), they will
greatly increase my ability to express memory safety invariants in
capnproto-rust.


On Sat, Feb 1, 2014 at 7:57 AM, Niko Matsakis <n...@alum.mit.edu> wrote:

> Regarding the marker types, they are somewhat awkward, and are not the
> approach I originally favored. But they have some real advantages:
>
> - Easily extensible as we add new requirements, unlike syntax.
> - Easily documented.
> - These bounds are only used for unsafe code, so it's not something
>   ordinary users should have to stumble over.
>
> What concerns me more is that marker types are "opt in" -- so if you
> don't know that you need them, and you build a datatype founded on
> unsafe code, you can get incorrect behavior. There may be some steps
> we can take to mitigate that in some cases.
>
> In any case, the use of marker types are also quite orthogonal to your
> other concerns:
>
> > This also makes the intent much more clear.   Currently, one would have
> to
> > dig into the definition of MutItems<'a,T> to figure out that the lifetime
> > parameter 'a is used to create a dummy borrow field into the vector, so
> > that the whole iterator is then treated as a mutable borrow.   This feels
> > very convoluted, if you ask me.
>
> I disagree -- I think treating lifetime and type parameters uniformly
> feels cleaner than permitting lifetime bounds to appear in random
> places. Presumably `'a Foo<T>` would be syntactic sugar for `Foo<'a, T>`?
> There's an obvious ambiguity here with `&'a T`.
>
> > On a slightly different note, is there a strong reason for having to name
> > lifetime parameters explicitly?   Could we simply re-use actual parameter
> > names prefixed with ' as their lifetimes?
>
> It is plausible we could say that a lifetime parameter name that is
> the same as a local variable binding whose type is a borrowed pointer
> refers to the lifetime of that borrowed pointer. To me, it feels like
> a rather ad hoc rule, though I can see it would sometimes be convenient.
>
> The current rules are intended to showcase how lifetime parameters work
> precisely like type parameters. In other words, we write:
>
>     fn copy<T>(t: T) -> T;
>
> we do not write:
>
>     fn copy(t) -> t;
>
> In the same way, we identify and declare lifetime parameters.
>
> Note that lifetime parameters do not have a natural one-to-one
> relationship with variables. It's certainly possible (and reasonable)
> to declare a function like:
>
>     fn foo<'a, 'b, 'c>(x: &'a Foo<'b, 'c>)
>
> In which case, the meaning of `'x` is pretty unclear to me.
>
> > The above could then be reduced to this:
> >
> >     pub trait MutableVector<T> {
> >         fn mut_iter(self) -> 'self MutItems<T>;
> >         ...
> >     }
> >
> > This used to be valid syntax, btw, though it worked because 'self
> lifetime
> > was special, IIRC.
>
> Writing `'self` was valid syntax, but it didn't have the meaning you
> are proposing. Which is one of the reasons we removed it.
>
>
>
> Niko
> _______________________________________________
> Rust-dev mailing list
> Rust-dev@mozilla.org
> https://mail.mozilla.org/listinfo/rust-dev
>
_______________________________________________
Rust-dev mailing list
Rust-dev@mozilla.org
https://mail.mozilla.org/listinfo/rust-dev

Reply via email to