On 22 March 2012 00:08, Brandon Allbery <[email protected]> wrote:
> * + $c --- the next value is the current value plus $c. ("*" means
> "Whatever", and generally refers to the current value of something. In this
> case, we're specifying how to make a new value given a current value. You
> can think of it as a way to make an anonymous function. In Haskell this
> would be "(+ c)" or "\x -> x + c"; in Python, "lambda x: x + c"; in Perl 5,
> "sub {$_[0] + $c}". The meaning of * is context dependent, though; when
> accessing array elements, for example, * refers to the end of the array, so
> @arr[* - 1] means the second last element of @arr.)
Interesting... a lambda expression...
> my &add3 = * + 3
WhateverCode.new()
>
> add3(2)
5
Cool... this actually works... But I notice that to use 'add3' in the
list construction I need to put an ampersand:
> 2, &add3 ... 14
2 5 8 11 14
Still... the fact that this works is neat.
> * >= $b --- this determines where the sequence ends: when the current value
> is greater or equal to $b.
So... after the "..." you have an anonymous function that has to
return 'True' for the sequence to end? Seems strange, but it works:
# A "function" that always returns True => List of one item.
> 2,5...True
2
So if I want to go from $a to $b by steps of $c, the correct recipe would be:
$a, *+$c ... * >= $b - $c
With this information, I can write something like this:
sub infix:<|>( Range $r, Int $c ) {
my ($a, $b) = $r.bounds;
return $a, *+$c ... * >= $b - $c
}
(2..10)|3 == 2, 5, 8
This would look better if I removed the parenthesis, but I'm having
trouble telling Rakudo that this infix operator is looser than the ..
operator:
sub infix:<|>( Range $r, Int $c ) is looser( &infix:<..> ) {
...
}
No applicable candidates found to dispatch to for 'trait_mod:<is>'.
> haral:6704 Z$ ./perl6 -e 'say (2, 4 ... 10).^methods'
Thanks. That's very useful.
> The .^ operator runs a method on the object's "metaobject", which determines
> how it associates with its class and roles. The metaobject is available via
> the HOW method, but is not something you can print or etc.; working with it
> directly is somewhat painful, which is why .^ exists.
Ok.
--
I'm not overweight, I'm undertall.