Cursus Raku / Functioneel, concurrent, reactief en webprogrammeren / Functioneel programmeren / Generatoren
Luie gather
Een gather-blok is lui: het draait niet in één
keer. Het produceert waarden pas zodra ze eruit gehaald worden, wat
betekent dat een gather een eindeloze
reeks kan beschrijven en toch bruikbaar blijft — je stopt eenvoudigweg
met waarden opnemen zodra je er genoeg hebt.
Het addertje is dat je het resultaat lui moet houden. Het in een
gewone @array bewaren zou proberen elke waarde in één keer
te verzamelen, en voor een eindeloze reeks eindigt dat nooit. Bewaar de
reeks in plaats daarvan in een scalair (waar ze een luie
Seq blijft) en haal er een plak uit:
my $naturals = gather {
my $n = 1;
loop {
take $n++;
}
}
say $naturals[^5]; # (1 2 3 4 5)De loop eindigt nooit, maar er worden ooit slechts vijf
waarden geproduceerd, want dat is alles waar we met [^5] om
vroegen. Je kunt ook vooraan waarden weghalen met
.head:
say (gather { my $n = 1; loop { take $n++ } }).head(3); # (1 2 3)Luiheid is wat gather oneindige stromen veilig laat
modelleren: er wordt niets berekend tot het nodig is, en je neemt
precies zoveel als je wilt.
Cursusnavigatie
← Quiz — gather en take | Verzamel de derdemachten →
💪 Of ga direct naar de oefeningen in deze
sectie.