On Fri, Feb 24, 2006 at 04:56:40AM +0000, Luke Palmer wrote: : On 2/24/06, Damian Conway <[EMAIL PROTECTED]> wrote: : > No. One of the available TRAITS is C<returns RETTYPE>. So you can always : > specify a "postfix" return type, even without a declarator: : > : > sub data() returns Str {...} : > : > The declarator is only needed if you want to "prefix" your return type : > (presumably because you're pining for C/C++ ;-): : > : > our Str sub data() {...} : : Didn't we decide that: : : our Str sub foo() {...} : : Was equivalent to: : : our sub foo(--> Str) {...} : : But not to: : : our sub foo() returns Str {...} : : ? : : Come to think of it, that seems backwards. After all, aren't: : : my Foo $x; : my $x of Foo; : : Equivalent? : : Come to think of it, it's probably a bad idea to have a distinction at all.
Au contraire, I think it's a good idea in the mindthink of "Be strict in what you emit." Or maybe it's "Underpromise and overperform." The prefix and --> forms advertise a particular promise, but the routine might actually wish to be pickier than that on what it actually emits, and rather than casting every return statement to a particular type, can say "returns Str" instead. Say, for instance, you're in a situation where the return type might be used for a tiebreaker, but you want to reserve that "namespace" for yourself. On the other hand, your current implementation is perhaps TCLishly string oriented. But you want to call out to other functions that aren't "Str filtered". You can declare sub foo (--> Any) returns Str { return whatever(); } and force Str context on whatever() without promising that you're doing that do everyone else. Larry