Per6 空気を読むスマートマッチャー

PerlはDWIMを恥じない。DWIM=Do What I Mean 「思っているように動け」
裏を返せば明示的に指示していないことをしろということになる。これはPythonの「explicit is good」の正反対の考えだ。Perl6のスマートマッチャーはDWINオペレータと言える。

http://perl6advent.wordpress.com/2010/12/12/day-12-%E2%80%93-smart-matching/

「~~」はスマートマッチャーを呼ばれるinfixオペレータで、左右の引数から適切なpredicateを呼び出す。大抵ブールを返すがregexのときはマッチオブジェクトを返す。equality test (==)の一般化と考えていいのではないだろうか。理屈より例の方がピンとくる。 (元記事から)

タイプに属する?

$foo ~~ Str

数値や文字列(スケーラ全般?)の場合 == と同等

$foo ~~ 6
$foo ~~ "bar"

regex: perl5の=~と同じ

$foo ~~ / \w+ '-' \d+ /

数値レンジ

$foo ~~ (15..25)

クロージャによる任意のpredicate

$foo ~~ -> $x { say 'ok' if 5 < $x < 25 }
こう書くよりはあまりなく、「give .. when PRED {..}」文のPREDがこう解釈されるんだろう。
この例のもこれで解釈するとわかる。
1, 2, 4 ... * > 10; # 1 2 4 8 16
2**nをクロージャ -> $x { $x > 10 } がtrueになるまで拡張する、と読めばいいのだろう。

リストのパターンマッチングなんてのもあるんだな

$foo ~~ [1, *, 1, *, 1, *]

この空気を読む~~賢いマッチャーはACCEPTというメソッドことにより、user-definedタイプでも定義できる。元記事のclass Pointを参照。

こういう裏があるコードは何がおきているのか考えなが読まなきゃいけないので疲れる。Pythonのように読んで文字通りのコードの方が楽な気がする。それでもPerl6には魅力的なものがあるので勉強し続けることにしよう。