Re: r25807 - docs/Perl6/Spec
On Thu, Mar 12, 2009 at 06:29:19PM -0700, Jon Lang wrote: : +To declare an item that is parsed as a simple term, you must use the : +form C term:foo , or some other form of constant declaration such : +as an enum declaration. Such a term never looks for its arguments, : +is never considered a list prefix operator, and may not work with : +subsequent parentheses because it will be parsed as a function call : +instead of the intended term. (The function in question may or : +may not exist.) For example, Crand is a simple term in Perl 6 : +and does not allow parens, because there is no Crand() function : +(though there's a C$n.rand method). : : 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... Larry
Re: r25807 - docs/Perl6/Spec
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
Re: r25807 - docs/Perl6/Spec
+To declare an item that is parsed as a simple term, you must use the +form C term:foo , or some other form of constant declaration such +as an enum declaration. Such a term never looks for its arguments, +is never considered a list prefix operator, and may not work with +subsequent parentheses because it will be parsed as a function call +instead of the intended term. (The function in question may or +may not exist.) For example, Crand is a simple term in Perl 6 +and does not allow parens, because there is no Crand() function +(though there's a C$n.rand method). 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? Or would I have to say: rand($n:) to get the indirect method call? -- Jonathan Dataweaver Lang