When learning Raku, one of the best things you can do is to experiment with the language in the interactive shell. (Also known as REPL = Read Eval Print Loop)
Once you have Rakudo installed, open a Terminal (or Command Prompt in MS Windows) and type in raku. If you are using the Docker version of Rakudo Star then run it in interactive mode as
docker run --rm -it rakudo-star
After a second or so, you will see:
To exit type 'exit' or '^D'
>
The > sign is the prompt. You can now type in any Raku expression. Let's start with a few simple ones:
> say "hello world"
hello world
> say 42
42
> 19 + 23
42
say
is the keyword to print something to the screen and add a trailing newline.
Strings are in double-quotes. Numbers don't have quotes.
We can use Raku as a calculator. In the interactive shell we don't even need to call say as it will automatically print the result of the last statement. (The P is in the name REPL for a reason.)
Variables
Most variables in Raku have one or two special characters at the beginning. The first such character is called Sigil, the second, optional character is called Twigil.
The $
sigil means the variable can contain any item.
Let's try to assign a number to a variable that starts with a $
:
> $x = 42
===SORRY!=== Error while compiling:
Variable '$x' is not declared
------> <BOL>⏏$x = 42
Even the interactive shell requires us to declare our variables using the my
keyword:
> my $x = 42
42
> $x
42
> $x - 7
35
After the declaration and the assignment, we can use the variable in arithmetic operations.
Using the ^name
method we can also ask the variable what type is it. In this case it is of type Int
:
> $x.^name
Int
We can replace the content of the variable with a string, and then, when we ask what is the ^name of its type, we get back that it is a Str.
> $x = "abc"
abc
> $x.^name
Str
Some people love this kind of flexibility, for others this looks crazy dangerous. Don't worry, In Raku, you can be much stricter with your variable types during declaration. If that's your thing:
> my Int $w = 42
42
> $w.^name
Int
> $w = "hello"
Type check failed in assignment to $w; expected Int but got Str ("hello")
in block <unit> at <unknown file> line 1
>
In this case, we've declared the $w variable to be Int
so we won't be able to
assign any other type to it.
Back to our type declaration free variable, you can put all kind of other types in that variable:
> $x = 3.14
3.14
> $x.^name
Rat
> $x = ["foo", "bar", "qux"]
[foo bar qux]
> $x.^name
Array
> $x = ("foo", "bar", "qux")
(foo bar qux)
> $x.^name
List
> $x = {name => "Foo", answer => 42}
{answer => 42, name => Foo}
> $x.^name
Hash
> $x = planet => "Earth"
platent => Earth
> $x.^name
Pair
We'll look at these types later on.
Pair
> $x = planet => "Earth"
planet => Earth
> $x.^name
Pair
> $x.gist
planet => Earth
> $x.key
planet
> $x.value
Earth
Hash
A Hash is a key-value store. In other languages it might be called Associative Array
or Dictionary
.
We can create a hash using curly-braces, and assign it to a variable starting with a $
:
> my $x = {home => "Earth", answer => 42};
{answer => 42, home => Earth}
It is a hash:
> $x.^name
Hash
We can access the values of the individual keys both with quotes around the keys:
> $x{"home"}
Earth
> $x{"answer"}
42
And without any quotes:
> $x<home>
Earth
> $x<answer>
42
We can fetch the keys
of the hash and the values
separately:
> $x.keys
(home answer)
> $x.values
(Earth 42)
What keys
really returns is a Seq
(Sequence) object:
> my $z = $x.keys
(home answer)
> $z.^name
Seq
We can also iterate over the individual keys using the for
loop.
($k is the loop variable that will get each key on its turn.)
> for $x.keys -> $k { say $k }
home
answer
Using the keys we can access the respective values:
> for $x.keys -> $k { say $k; say $x{$k} }
home
Earth
answer
42
Alternatively we can fetch a list of pairs
and on each Pair
object we can call the key
and the value
methods:
> for $x.pairs -> $p { say $p.^name; say $p.key; say $p.value}
Pair
home
Earth
Pair
answer
42
List
If we wrap the right-hand side in parentheses, we get a List
on the left-hand side:
> $x = ("Earth", "Wind", "Fire")
(Earth Wind Fire)
> $x.^name
List
In order to iterate over its elements, we need to call the list
method on it:
> for $x.list -> $v { say $v }
Earth
Wind
Fire
Array
If we put square brackets around the values on the right-hand side, we
get an Array
> $x = ["Earth", "Wind", "Fire"]
[Earth Wind Fire]
> $x.^name
Array
Here too we need to call the list
method in order to iterate over the elements:
> for $x.list -> $i { say $i }
Earth
Wind
Fire
Forgetting the parentheses
If you forget the parentheses, Raku will silently forget about all the values except the first one.
> $x = "Earth", "Wind", "Fire"
(Earth Wind Fire)
> $x.^name
Str
> $x
Earth
Conclusion
The REPL is a nice place to experiment with features, but we have to learn a lot more about Raku to make it useful for us.