Perl

【LT没資料】 From Haskell to Perl

More than 1 year has passed since last update.

YAPC::Hokkaido SAPPORO のLTに応募しましたが、採択されませんでしたので没になった資料をそのまま公開します。



まだ型チェックの厳しい言語で消耗してるの?



動的型付け言語を使おう!



quickcheck


  • 単体テストライブラリ

  • 満たすべき性質を記述する

  • テストケースを自動生成

  • ランダムに生成する (VS smallcheck)

  • テストケースの確率分布はプログラマが制御する



Test::RandomCheck

Test::RandomCheck


  • quickcheckをPerlへ移植したもの



使用例

例えば新人が挑戦的な length 関数を書いてきた時。

use List::Util qw(sum);

sub my_length {
(my $x = splice @_, 0, 1) =~ s/./2/g;
sum (split //, $x || 0) >> 1;
}



lengthの性質


  • length("") == 0

  • length($char) == 1

  • length($s1 . $s2) == length($s1) + length($s2)



空文字列のチェック

is my_length(""), 0;



単位のチェック

性質を式に書く。

my_length($char) == 1;



単位のチェック

Test::RandomCheck を使う。

use Test::RandomCheck;

use Test::RandomCheck::Generator;

random_ok {
my $char = shift;
my_length($char) == 1;
} char;



演算の保存のチェック

性質を式に書く。

my_length($s1) + my_length($s2) == my_length($s1 . $s2);



演算の保存のチェック

性質の記述に必要な型を、Test::RandomCheck::Generator で定義。

my $type_of_arguments = concat(string, string);



演算の保存のチェック

Test::RandomCheck を使う。

my $type_of_arguments = concat(string, string);

random_ok {
my ($s1, $s2) = @_;
my_length($s1) + my_length($s2) == my_length($s1 . $s2);
} $type_of_arguments;



自然性をチェックしてみる

性質を式に書く。

my @chars = split //, $str;

my $mapped = join '', map { $f->($_) } @chars;
my_length($str) == my_length($mapped);



自然性をチェックしてみる

性質の記述に必要な型を、Test::RandomCheck::Generator で定義。

my $type_of_arguments = concat(string, function(char, char));



自然性をチェックしてみる

こんな感じ。

my $type_of_arguments = concat(string, function(char, char));

random_ok {
my ($str, $f) = @_;
my @chars = split //, $str;
my $mapped = join '', map { $f->($_) } @chars;
my_length($str) == my_length($mapped);
} $type_of_arguments;



まとめ


  • 性質を検査できるのは便利

  • 生成される変数の質が悪いから手直しいるかな・・・