On Fri, Oct 18, 2013 at 9:34 PM, Gábor Lehel <illiss...@gmail.com> wrote:
> Hi list, > > This is meant as a followup to an earlier thread[1] on the subject and the > related ticket[2]. > > [1]: http://thread.gmane.org/gmane.comp.lang.rust.devel/2622/ > [2]: https://github.com/mozilla/rust/issues/6974 > > The idea in those earlier discussions is that methods could also be called > using function syntax, supplying `self` as the first argument, so instead > of `self_arg.method(arg)`, you could write `method(self_arg, arg)`. I'm > wondering if this could be taken a couple steps further to simplify the > whole story regarding functions, methods, traits, and impls. The idea is > that the distiction between functions and methods would be erased almost > completely, and methods (now being just functions) would be imported > explicitly. > > It would involve the following pieces: > > - If the first argument of a top-level `fn` is named `self`, it can be > called using method syntax. So if you have `fn foo(self: &MyType, n: int) > { .. }` at the top level, you can write `object_of_my_type.foo(123)`. You > can also still call it using function syntax: `foo(object_of_my_type, 123)`. > I see no reason for the restriction of "self". Why not simply say that any function can be called with "first_arg.func(...)" style ? Regarding the idea in general, I like the elegance that such harmonization brings. -- Matthieu > > - Anonymous `impl`s could then be removed in favor of such top-level > `fn`s. Alternately, they could be kept as syntactic sugar for the same > thing. > > - Just as the distinction between functions and anonymous-impl methods > would be erased, the distinction between trait methods and associated > functions would also be erased. A function declared inside a trait would > exist in module scope, just like top-level `fn`s. Just like other > functions, you could call it using method syntax if the first argument is > named `self`, or using function syntax either way. > > - The existing syntax for `self` arguments could then be removed. > Alternately, it could be kept as syntactic sugar (`?self` becoming `self: > ?T`, where `?` is any sigil or none). > > - Now that everything is a top-level `fn`, they would be imported > explicitly, like they (and all other things) already are. Here we can > remove the restriction on methods needing to be declared in the same > module/crate as their `self` type. > > - Functions can be called using method syntax only if they are declared > in, or imported into, the current scope directly. In other words, if you > could call them using function syntax unqualified. > > - If a method call is ambiguous, you would have the following options to > resolve it: > > (a) Tweak your imports so that only the method you want is in scope. > > (b) Import the method under a different name instead. > > (c) Use function call syntax instead with an explicit module qualifier. > > Again, more or less the same options you have with any non-method item in > the current language. > > > Disadvantages of this scheme: > > - More typing. (Explicit imports for one; if sugar is removed, then that > as well.) > > > Advantages: > > - Simplicity and transparency. The special rules and language constructs > for declaring and importing methods would go away. Methods would work the > same way as other things do. > > - Correspondingly, you would also have better control over which methods > are imported and invoked. > > - You could declare methods for any type in any crate or module, without > having to create extraneous traits, which I feel is a wart in the current > language. Traits could then be used for abstraction only, which I feel is > their correct purpose. > > - Because methods would just be module-scope functions, they could be > referred to as values (e.g. as arguments to higher-order functions) without > a lambda shim. > > - I was confused at one point because `&self` looks a lot like a pattern > match, but is not one. That could go away. > > - The current difficulties with generic methods (`impl<T: Foo> T { .. }` > in the current language) might, or might not, be reduced. (I don't know of > any similar issues with generic top-level functions, but they might > resurface if called as methods). > > - The significance of the argument named `self` could also potentially be > removed, instead allowing the first argument to be used as the > self-argument in a method call, no matter what it's called. This would > allow for pattern matching on the self-argument in the definition of the > method, which is currently not possible. > > > Hope this is helpful or interesting, > Gábor > > -- > Your ship was destroyed in a monadic eruption. > > _______________________________________________ > 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