On Sat, Mar 14, 2009 at 7:29 AM, Larry Wall <la...@wall.org> wrote:
> : So if I were to say:
> : rand $n:
> : is the compiler smart enough to notice that trailing colon and
> : recognize this as an indirect method call rather than two adjacent
> : terms?
> No, currently under STD you get:
> Obsolete use of rand(N); in Perl 6 please use N.rand or (1..N).pick
> instead at (eval) line 1:
> : Or would I have to say:
> : rand($n:)
> : to get the indirect method call?
> That would work, but then why not:
> In fact, given that you usually want to integerize anyway, I could
> almost argue myself out of supporting the $n.rand form as well...
It's largely a matter of principle: if I can say $x.foo, I expect to
be able to say foo $x: as well. Every time you introduce an exception
to the rule, you're throwing something in that has the potential to
cause confusion; so you should do so with some caution. I think that
"best uses" should include something to the effect of "avoid using the
same identifier for both a term and a routine". IMHO, rand should
either be a term or a method; but not both.
There are also some linguistic reasons for this "best uses" proposal:
people tend to think of terms as nouns and routines as verbs. And
gerunds are more akin to "&foo" than to "term:<foo>".
Left-field idea here: there was recently some discussion on this list
about the possibility of continuous ranges, which would be in contrast
to how 1..$n is a discrete list of options. If you were to do this,
then you could use .pick on a continuous range to generate a random
number anywhere within its bounds. So:
(1 to 5).pick
(where infix:<to> creates a continuous range, inclusive of both
boundaries) would in theory be as likely to return 2.5 or pi as 3.
IMHO, this does a better job of handling what most people want rand to
do when they start thinking in terms of assigning parameters to it.
And with that in place, rand could become a term that's short for
pick (0 to^ 1):
Jonathan "Dataweaver" Lang