Article Series

This article series discuss more than 30 different programming languages. Please read overview before you read any of the details.

Playing with Records Related Articles.

Where to Discuss?

Local Group

Preface

Goal: Continue Part One


4: Map And Grep

Almost List Comprehension.

Raku has very similar feature with perl5. It natively has support for map, and filtering with grep.

But further, raku support list comprehension.

Simple Example

Consider examine map, applying to our songs records.

my @songs_title = @songs.map: *<title>;
say join(':', @songs_title);
  • With the result as below:
Cantaloupe Island:Let It Be:Knockin' on Heaven's Door:Emotion:The River

And then go further with grep.

my @songs_tags = (@songs
  .grep: *.keys.grep(/tags/))
  .map: *<tags>;

for (@songs_tags) {
  say join(":", @$_);
}
  • With the result as below:
60s:jazz
60s:rock
70s:rock
70s:pop

we can examine the object shown in output result above.

Raku: Examining Map and Grep

Unique

With just a little modification, we can flatten the array using built in function, and also get the unique array using built in function.

use MySongs;

my @songs_tags = ((@songs
  .grep: 'tags'  *.keys)
  .map: *<tags>);

my @tags = @songs_tags.List.flat.unique;

join(":", @tags).say;
  • With the result similar as below record:
❯ ./13-unique.raku
60s:jazz:rock:70s:pop

Raku: Map and Grep: Unique


5: List Comprehension

The True One

As I said before, raku support list comprehension.

Simple Example

Consider examine map, applying to our songs records.

my @songs_title =
  ( $_<title> for @songs );
say join(':', @songs_title);
  • With the result as below:
Cantaloupe Island:Let It Be:Knockin' on Heaven's Door:Emotion:The River

And then go further with grep.

my @songs_tags = (
  $_<tags>
  if $_.keys.grep(/tags/)
  for @songs
);

for (@songs_tags) {
  say join(":", @$_);
}
  • With the result as below:
60s:jazz
60s:rock
70s:rock
70s:pop

we can examine the object shown in output result above.

Raku: Examining List Comprehension

Unique

With just a little modification, we can flatten the array using built in function, and also get the unique array using built in function.

use MySongs;

my @songs_tags = (
  $_<tags>
  if 'tags'  $_.keys
  for @songs
);

my @tags = @songs_tags
  .List.flat.unique;

join(":", @tags).say;
  • With the result similar as below record:
❯ ./17-unique.raku
60s:jazz:rock:70s:pop

Raku: List Comprehension: Unique

Preview

As a summary, we can compose all in just one script.

#!/usr/bin/raku

my @songs =
  { title => 'Cantaloupe Island',
    tags  => ('60s', 'jazz') },
  { title => 'Let It Be',
    tags  => ('60s', 'rock') },
  { title => 'Knockin\' on Heaven\'s Door',
    tags  => ('70s', 'rock') },
  { title => 'Emotion',
    tags  => ('70s', 'pop') },
  { title => 'The River'}
;

my @songs_tags = (
  $_<tags>
  if 'tags'  $_.keys
  for @songs
);

my @tags = @songs_tags
  .List.flat.unique;

join(":", @tags).say;

Raku: List Comprehension: Unique


What is Next 🤔?

We have alternative way to do get unique list. We will also discuss about concurrency.

Consider continue reading [ Raku - Playing with Records - Part Three ].