Perl 6の研究のコーナーです。
 今日は数値と計算について研究します。


100-bit machine with mouse-2
 PerlはPure OOPL(Pure Object Oriented Programming Language=純粋オブジェクト指向言語)で、すべての式、値がオブジェクトです。
 「Hello Worldと言う」という書き方も

say "Hello World!";

というサブルーチン的な書き方と

"Hello World!".say;

というメソッド的な的な(OOP的な)書き方があります。どうせだからOOP的な書き方をします。

 数値の計算は

#! /usr/bin/env perl6
# calc.p6 -- Perl 6で計算

(1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10).say;

とすると

[sample]$ ./calc.p6
55
[sample]$

のように普通に行うことができます。ちなみにプログラムの拡張子は、Perl 5同様.plとしてもいいですが、Perl 6であることを際立たせたければ.p6と書いてもいいそうです。まあ、UNIXではshebang行で実行エンジンが決まるので拡張子に大した意味はありません。

 さて、Perl 5の変数は型指定をしなくてもいいですが、Perl 6の変数は型指定をしてもいいということになりました。
 もし型指定をしなければAny型という型になります。

#! /usr/bin/env perl6
# calc4.p6 -- Perl 6で計算4

$num = 1;
$num /= 3;
$num *= 3;

$num.say;

だと

[sample]$ ./calc4.p6
===SORRY!=== Error while compiling /Users/query1000/Dropbox/kpc/sample/./calc4.p6
Variable '$num' is not declared. Did you mean 'num'?
at /Users/query1000/Dropbox/kpc/sample/./calc4.p6:4
------> ⏏$num = 1;

となります。Perl 6はuse strict状態がデフォルトで、変数を宣言しないで使うと怒られるのです。

 あらためて

#! /usr/bin/env perl6
# calc5.p6 -- Perl 6で計算5

my $num = 1;
$num /= 3;
$num *= 3;

$num.say;

とすると

[sample]$ ./calc5.p6
1

となります。

 ここで、

#! /usr/bin/env perl6
# calc6.p6 -- Perl 6で計算6

my Int $num = 10;
$num /= 3;
$num *= 3;

$num.say;

と書くと

[sample]$ ./calc6.p6
Type check failed in assignment to $num; expected Int but got Rat
in block at ./calc6.p6:5

と怒られました。「$numへの代入に置いて、型チェックが失敗した。Intが要求されているのにRatが返ってきた」と言われます。

#! /usr/bin/env perl6
# calc7.p6 -- Perl 6で計算7

my Int $num = 10;
$num = ($num / 3).Int;
$num *= 3;

$num.say;

とすると

[sample]$ ./calc7.p6
9

となります。ここでIntは型変換のメソッドとして機能します。$num / 3の答え3.333333を整数化して3になり、それを3倍した値9が表示されています。

 さて、Rat型とはなんでしょうか。これはネズミ型ではなく、Rational(有理数)型です。

#! /usr/bin/env perl6
# calc8.p6 -- Perl 6で計算8

my Rat $num = 10;
$num = $num / 3;
$num *= 3;

$num.say;

とすると

[sample]$ ./calc8.p6
===SORRY!=== Error while compiling ./calc8.p6
Cannot assign a literal of type Int (10) to a variable of type Rat. You can declare the variable to be of type Real, or try to coerce the value with 10.Rat or Rat(10), or just write the value as 10.0
at ./calc8.p6:4
------> my Rat $num = ⏏10;

と怒られます。「Int型リテラル10をRat型に代入することはできません。変数をReal型で宣言するか、値を10.Rat、Rat(10)のように強制型変換(coerce コワース)するか、10.0と書いてください」とのこと。フムフム。

#! /usr/bin/env perl6
# calc9.p6 -- Perl 6で計算9

my Rat $num = 10.0;
$num = $num / 3;
$num *= 3;

$num.say;

だと無事に

[sample]$ ./calc9.p6
10

となります。一方Real型(実数型)を使って

#! /usr/bin/env perl6
# calc10.p6 -- Perl 6で計算10

my Real $num = 10;
$num = $num / 3;
$num *= 3;

$num.say;

でも無事に

[sample]$ ./calc10.p6
10

となります。

 Rat型には分数を入れることができます。

#! /usr/bin/env perl6
# calc11.p6 -- Perl 6で計算11

my Rat $num = 1/3 + 2/3;

$num.say;

だと

[sample]$ ./calc11.p6
1

となりますし、

#! /usr/bin/env perl6
# calc12.p6 -- Perl 6で計算12

my Rat $num = 1/2 + 1/3;

$num.say;

だと

[sample]$ ./calc12.p6
0.833333

となります。(5/6は0.83333)

 Complexは複素数型です。

#! /usr/bin/env perl6
# calc13.p6 -- Perl 6で計算13

my Complex $num = (-1).Complex.sqrt;

$num.say;



[sample]$ ./calc13.p6
6.12323399573677e-17+1i

となりますが、これは

[sample]$ perl6 -v
This is perl6 version 2015.11 built on MoarVM version 2015.11

のバグです。これはdankogaiさんによってフィックスされました。

Bug #127126 for perl6: [PATCH] Decent sqrt() - makes sqrt(-1+0i) == i

 Macのrakudo-starをアンインストールして再インストールしてみます。

[sample]$ brew update
Updated Homebrew from ccccea6 to 827e588.
==> New Formulae
assh dlite gitg hledger hyperscan nuxeo
==> Updated Formulae
ammonite-repl hadoop pyenv
botan htmlcleaner pyenv-virtualenv
carthage icmake rakudo-star ✔
chromaprint influxdb redpen
chromedriver jenkins reposurgeon
cpanminus jetty rethinkdb
cromwell kapacitor saltstack
dmd kibana sbcl
dnscrypt-proxy ldc skinny
dnstwist leiningen snort
docker libgit2-glib socat
docker-compose libgraphqlparser sonar-runner
docker-machine libtermkey sourcekitten
docker-swarm libtins src
dropbear libuv swiftlint
dyld-headers libvoikko sysdig
elasticsearch logstash tailor
etcd macvim tbb
ffmpeg mercurial telegraf
flow mesos terraform
fstar monit tippecanoe
fwup msmtp unrar
fzf mysql valabind
git nettle vert.x
git-credential-manager nss vim
git-lfs passpie watchman
gnuradio pdns wires
gnutls proftpd yaml-cpp
h2o puddletag youtube-dl
[sample]$ brew install rakudo-star
brew install rakudo-star
Error: rakudo-star-2015.11 already installed
To install this version, first `brew unlink rakudo-star`
[sample]$ brew unlink rakudo-star
brew unlink rakudo-star
Unlinking /usr/local/Cellar/rakudo-star/2015.11... 28 symlinks removed
[sample]$ brew install rakudo-star
brew install rakudo-star
==> Downloading https://homebrew.bintray.com/bottles/rakudo-star-2016.01.
################################################################## 100.0%
==> Pouring rakudo-star-2016.01.el_capitan.bottle.1.tar.gz
🍺 /usr/local/Cellar/rakudo-star/2016.01: 913 files, 26M
[sample]$ perl6 -v
perl6 -v
This is Rakudo version 2016.01.1 built on MoarVM version 2016.01
implementing Perl 6.c.

 あらためて

[sample]$ ./calc13.p6
./calc13.p6
0+1i
[sample]$

 デキター!
 ちょっと面白いところが起きたところで今日はココマデ!