Ever since I received "Think Perl 6" book as a gift by Neil Bowers at the London Perl Workshop 2017, I have been planning to start learning Perl6 without any luck. I can think of many reasons why. One of the reasons was my confusion where to start. First I thought, I will start from the basics but then I easily get distracted if I don't have a target. Then I realised why not pick one of my Perl5 distributions and convert it into Perl6. That sounded great idea.

I tweeted about my intention and asked for help. Immediately two people kindly came forward, Scimon Proctor and JJ Merelo. With their guidance and support, I decided to create a basic Calculator distribution. Once I got the approval of the two mentors, I started preparing the ground.

First thing first, I need to have latest Perl6 environment.I had installed Rakudo 2016.10 long time ago. So I decided to install the latest Rakudo 2018.10 as suggested here. Installation was smooth without any issues. However post installation when I checked the installed Perl6 version, it was still saying "2016.10". I was confused why it was not telling "2018.10". I decided to consult IRC channel for Perl6 #perl6.

As soon as I logged in, I saw TimoTimo online and he immediately recognised me and said "Hi Mohammad". I met TimoTimo last year at German Perl Workshop. He is a gem of a person. With his help, I fixed the configuration issue.

So now I have working Perl6 environment. Scimon Proctor, suggested App::MI6 to create the skeleton of new distribution.

$ zef install App::Mi6

Now it is time to create my first Perl6 distribution.

$ mi6 new Calculator

With the above magical command, I have a testable distribution. It is time to get hand dirty and start coding. I found this page very handy to get me started with Class in Perl6. In no time, I have basic Calculator class like below (lib/Calculator.pm6):

use v6.c; class Calculator:ver<0.0.1> {

has Int $.x is required;

has Int $.y is required; method add() {

return self.x + self.y;

} method substract() {

return self.x - self.y;

} method multiply() {

return self.x * self.y;

} method divide() {

return self.x / self.y;

}

}

Now time to create unit test (t/01-basic.t):

use v6.c;

use Test;

use Calculator; my $c = Calculator.new( :x<10>, :y<5> ); is $c.add(), 15, '10+5';

is $c.substract(), 5, '10-5';

is $c.multiply(), 50, '10*5';

is $c.divide(), 2, '10/5'; done-testing;

Thats it, I am done. Time to test the code.

$mi6 test

Test passed without any issues.

Not a bad start for someone who waited for more than a year to start. Thanks for all the encouragements.

It is time to polish the code little bit and add the following bits:

a) Make sure x and y, both must be positive integer

b) Make sure y is always smaller than x

c) Add negative test.

I had absolutely no idea, how to do above. I went back to lovely people at IRC channel and saw JJ Merelo and gang available to help. With their support, I managed to got everything sorted. It now looks like below:

use v6.c; class Calculator:ver<0.0.1> {

has Int $.x is required where * > 0;

has Int $.y is required where * > 0; method TWEAK(:$!x!, :$!y!) {

die 'ERROR: x should be > y.' unless $!x > $!y;

}; method add() {

return self.x + self.y;

} method substract() {

return self.x - self.y;

} method multiply() {

return self.x * self.y;

} method divide() {

return self.x / self.y;

}

}

And unit test looks like below:



use v6.c;

use Test;

use Calculator; dies-ok { Calculator.new( :x<10>, :y<20> ) }, 'No Calculator object (x < y)';

dies-ok { Calculator.new( :x<10>, :y ) }, 'No Calculator object (y < 0)';

dies-ok { Calculator.new( :x, :y<20> ) }, 'No Calculator object (x < 0)'; my $c = Calculator.new( :x<10>, :y<5> ); isa-ok $c, 'Calculator', 'Calculator object';

is $c.add(), 15, '10+5';

is $c.substract(), 5, '10-5';

is $c.multiply(), 50, '10*5';

is $c.divide(), 2, '10/5'; done-testing;



The above code hosted on GitHub.

I think, there is not much scope left for me here. I will probably learn more about class in Perl6 and then convert one of my distribution to Perl6.

Watch this space, I will be back soon.