Luke Palmer <[EMAIL PROTECTED]> writes:
>> On Thu, Apr 03, 2003 at 07:29:37AM -0800, Austin Hastings wrote:
>> >This has been alluded to before.
>> >
>> >What would /A*B*/ produce?
>> >
>> >Because if you were just processing the rex, I think you'd have to
>> >finish generating all possibilities of A* before you began iterating
>> >over B*...
>>
>> The "proper" way would be to first produce all possibilities of length n
>> before giving any possibility of length n+1.
>>
>> ''
>> 'A'
>> 'B'
>> 'AA'
>> 'AB'
>> 'BB'
>> 'AAA'
>> 'AAB'
>> ...
>>
>> I haven't spent a milisecond of working out whether that's feasible to
>> implement, but from a theoretical POV it seems like the solution.
>
> Well, I'm not certain there is really a "proper" way. But sure, your
> way is doable.
>
> use Permutations <<permutations compositions>>;
>
> # Generate all strings of length $n
> method Rule::Group::generate(Int $n) { # Type sprinkles :)
> compositions($n, [EMAIL PROTECTED]) ==> map {
> my @rets = map {
> $^atom.generate($^n)
> } zip(@.atoms, $_);
> *permutations([EMAIL PROTECTED])
> }
> }
>
> How's that for A4 and A6 in a nutshell, implementing an A5 conept? :)
> I hope I got it right....
For bonus points:
method Rule::Group::generate_all($self:) {
for 1 .. Inf -> $i {
yield $_ for $self.generate($i);
}
}
Hmm... I wonder if there's a way of making the basic 'generate' method
lazy too.
--
Piers