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:
>
>    rand*$n
>    $n*rand
>    $n.rand
>    (1..$n).pick
>
> 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
something like:

    pick (0 to^ 1):

-- 
Jonathan "Dataweaver" Lang

Reply via email to