Haskell: 初期リリースのPugs 6.0.0をビルドしてみよう

Pugsが今熱い。」

そう思ってPugsの最新版であるバージョン6.2.11のソースコードを読んでみると、そのソースコードの量に圧倒されます。とてもじゃないけど、ソースコードを理解するのは難しそうです。開発が進めばもっとPugsの規模が大きくなって、もう追いかけるのは不可能。

でもそんなことで諦めるのは早いです。今がダメなら昔に戻ればいいんです。Pugsの初期バージョンなら、今とは違ってかなりシンプルなソフトウェアの構成になっているはずです。もしそうなら、Pugsソースコードを理解できるようになる可能性が高くなります。(期待通り、今よりも遥かにシンプルでした!)

PugsソースコードSubversionで管理されていて、開発者でなくても誰でもそれにアクセス可能です(当然コミットは不可)。そのため、Pugsの任意のリビジョンのソースコードを自由にゲットできます。「任意のリビジョン」ということは、古いバージョンのPugsソースコードもゲットできるということです。*1

Pugs 6.0.0のビルド

では、Pugsの初期リリースであるバージョン6.0.0のソースコードPugsリポジトリからゲットしてビルドしてみましょう。

PugsのビルドにはGHCが必要になるのですが、私はGHC 6.4.1を利用しました。もしかすると、Pugs 6.0.0のビルドには他のパッケージも必要かもしれません。技術評論社Software Design 2006/03 号の特集でPugsのビルド方法が説明されているので、そちらを参考にして最新版のPugsをインストールしておくと良いかもしれません。(私のマシンにはPugs 6.2.11がインストールされていて、その時にいくつかパッケージをインストールしました。)

すんなりmakeできれば良かったのですが、途中でエラーになる所が数箇所あったので、Pugsのsrcディレクトリ以下にあるHaskellのコードをちょっとだけ修正しました。その修正を反映させるpatchは以下からゲットできます。

ビルドは以下のようにすればできるはずです。Pugs 6.0.0のソースコードをゲットするために、svnコメントにrオプションに4を指定しています。

% cd ~
% wget http://vaio.redirectme.net/pugs/patch/build_pugs6.0.0.patch
% svn co http://svn.openfoundry.org/pugs -r 4 pugs6.0.0
% cd pugs6.0.0/src
% patch < ~/build_pugs6.0.0.patch
% cd ..
% perl Makefile.PL
% make

Pugs 6.0.0が動いた!

ビルドがうまくいったら、blibsディレクトリ以下にビルドされたpugsを実行してみます。

% ./blib/script/pugs
.=====. __  __  ____   ___    _________________________________________
||   || ||  || ||  || ||__'   Pugs 6: Based on the Perl 6 Synopses     
||====' ||__|| ||__||  __||   Copyright (c) 2005 Autrijus Tang         
||      `===='  ___|| `==='   World Wide Web: http://autrijus.org/pugs 
||             `===='         Report bugs to: autrijus@autrijus.org    
==             Version: 6.0.0 =========================================

Welcome to Pugs -- Perl6 User's Golfing System
Type :h for help

pugs> "Hello, " ~ "World"
"Hello, World"

動きました!!*2

Perl 6から文字列の結合が、ドット(.)からチルダ(~)に変わるそうですが、インタプリタで実行した「"Hello, " ~ "World"」の結果からもわかるように、それもPugs 6.0.0ですでに実装されていたみたいですね。

Pugs 6.0.0ではほとんど何もできないと思いますが、規模が大きくなりつつあるPugsを、今回のように原点に戻って勉強していくと面白いかもしれませんね。

*1:CPANから古いPugsをゲットすることも当然できます。ですがPugsのコードをいじってみたい場合は、リポジトリからチェックアウトしてくる方がおすすめです。svn diffが使えると便利だからです。

*2:エープリルフールだから嘘ついてるんじゃないのって思われるかもしれませんが、本当です。