Ruby
rubygems
パターンマッチ

続編 - RubyにHaskellよりも強力なパターンマッチを実装した

More than 3 years have passed since last update.

一ヶ月ほど前に、RubyにHaskellなどのような関数型言語のパターンマッチよりも強力なパターンマッチを実装したという記事を書きました。
その後、大きな進捗があったので、そのことについて書きたいと思います。

本ライブラリのソースコードはGitHubに公開しています。

ストリーム (無限リスト) に対するパターンマッチ

antimon2さんプルリクエストにより、ストリーム (無限リスト) に対するパターンマッチが行えるようになりました。
パターンマッチの結果もストリームとして返されるので無限の結果を持つパターンマッチを実行することもできます。
例えば、以下のように素数の無限列の中から双子素数をすべて取り出すパターンマッチを記述することができます。

require 'egison'
require 'prime'

include Egison

twin_primes = match_stream(Prime) {
  with(List.(*_, _x, __("x + 2"), *_)) {
    [x, x + 2]
  }
}

# print the first 10 prime twins
p twin_primes.take(10)
#=>[[3, 5], [5, 7], [11, 13], [17, 19], [29, 31], [41, 43], [59, 61], [71, 73], [101, 103], [107, 109]]

このコードもとても美しいと思いませんか?
初めてEgisonで無限のパターンマッチを行えるようにしてこれに対応するコードを動かした時、僕はとても感動しました。
既存の言語でも無限リストに対するパターンマッチは書けますが、全ての双子素数を直接列挙するようなパターンを簡単に書くことができません。
既存の言語では簡潔に記述できないプログラムを、本質的でかつ一般的な新たな構文を考えることによって簡潔に記述して動かすことは、プログラミングをしていて一番おもしろいことのひとつだと僕は思っています。

反響と今後の活動

Twitter上でも多くの反応があり、その後、1ヶ月の間にHacker News上でも2度も話題になり、日本だけでなく世界的にEgisonのパターンマッチについて知ってもらうことができました。(1回目2回目)
それにより、antimon2さんのようなEgisonを理解して貢献してくださる方も現れてとても嬉しかったです。
また、Ruby WeeklyでもEgisonが取り上げられたようです。
さらに、今年の9月開催のRubyKaigi 2014で、Egisonのパターンマッチについて発表させていただけることにもなりました。
より多くの方に面白いと思ってもらえるように良いプレゼンをしたいと思います。

OSSを広めるのは本当に大変だといつも思います。
日々少しずつでも開発も進めていきたいと考えています。

Egisonの理論を多くの方に理解してもらいたいと考え、Egisonについての論文も公開しています。
ぜひ読んでみてください。

最後に、Rubyistの皆さん、egison-rubyを使うのにぜひ挑戦してみてください。