I've been reading more closely into the impl/iface code and I think I've found another problem. The current `self` type is actually more than a type---rather it's a kind of type constructor. I think we should change it to be just a type, because we do not have other type constructors in our system and in general things do not hold together. Let me explain briefly what I mean.

Currently, the type `self` refers to "the type implemented the current iface". However, the self type is parameterized just as the containing iface. So, technically, you could have an iface like:

    iface foo<T> {
        fn bar<S>(x: self<S>);
    }

Now this would correspond to an impl like:

    impl of foo<T> for [T] {
        fn bar<S>(x: [S]) { ... }
    }

Here, the type `self<S>` was transformed to `[S]`. This is a fairly complex transformation, actually, as must "reverse-link" the parameter T from its use in `[T]` to the appearance in `foo<T>` and so forth. In fact, this transformation is not especially well-defined: there may be multiple types or no types which are equally valid.

To see why there could be multiple types, consider something like `impl<X> of foo<T> for either<T,X>`. What type does `self<S>` have? It would be valid for any `either<S,?>`.

To see why there might be no types, consider something like `impl of foo<uint> for uint`. What type does `self<S>` have? Or, similarly, consider:

    fn some_func<T: foo<uint>>(t: T) {
        t.bar(...);
    }

What is the type of the parameter expected by `bar`?

In other languages, there is support for parameterizing a function or type by a "type constructor" (which is essentially what `self` is). I don't think we need those capabilities, though of course we could add them later.

I would rather see the `self` type be like any other type parameter: non-parameterized. In that case, the iface shown above would be invalid. This does naturally mean that our type system is less expressive. However, its behavior is well-defined in all cases, which seems like a nice property to have.


Niko
_______________________________________________
Rust-dev mailing list
[email protected]
https://mail.mozilla.org/listinfo/rust-dev

Reply via email to