2011-10-16
■ Windowsでperl6.exe(2011.09版)をビルドする 
Windowsでrakudo 2011.09版のビルドに成功したので、その方法を解説します。perl6を実際に触ってみたい方はぜひどうぞ。(しかし、触る以前に情報が少なすぎるから困る)
用意するもの
perlとgccの実行ファイルの場所を環境変数PATHに通しておくこと。
- Strawberry Perl
- MinGW
- Parrot http://ftp.parrot.org/releases/devel/3.8.0/parrot-3.8.0.tar.gz
- NQP https://github.com/downloads/perl6/nqp/nqp-2011.09-8-ge3d5c8b.tar.gz
- Rakudo https://github.com/downloads/rakudo/rakudo/rakudo-2011.09.tar.gz
Parrotのビルド
Parrotの圧縮ファイルを展開し、その中のConfigure.plを以下のように実行する。これでC:\parrot\binにparrot.exe等の実行ファイルがインストールされる。
parrot>perl Configure.pl --optimize --prefix="C:/parrot" parrot>mingw32-make parrot>mingw32-make install
NQPのビルド
NQPはそのままではエラーが出てビルドできない。まず、NQPの圧縮ファイルを展開したらtools/lib/NQP/Configure.pmのコードを以下のように修正する。
if ($^O eq 'MSWin32') { # $text =~ s{/}{\\}g; ここをコメントアウトする
さらにVERSIONというファイルの中身が"2011.05"になっているので、"2011.09-8-ge3d5c8"に変更する。そうしないとrakudoのバージョンチェックに引っかかるので。
そして以下のように実行
nqp>perl Configure.pl --with-parrot="C:/parrot/bin/parrot.exe"
ここでMakefileが出来るが、このMekefileの中身を以下のように修正する。
# PERL = C:\strawberry\perl\bin\perl.exe PERL = C:/strawberry/perl/bin/perl.exe \を/に変更するだけ
そのままビルドするとlibparrot.dllが見つからずエラーになるので、nqpのフォルダにビルドしたlibparrot.dllをコピーしておく。
そしてmake installするとC:\parrot\binにnqp.exeがインストールされる。
nqp>mingw32-make nqp>mingw32-make install
Rakudoのビルド
rakudoの圧縮ファイルを展開し、libparrot.dllをrakudoのフォルダにコピーしておく。そして以下のように実行すればC:\parrot\binにperl6.exeがインストールされる。あとはC:\parrot\binを環境変数PATHに追加すれば完了。
rakudo>perl Configure.pl --with-nqp="C:/parrot/bin/nqp.exe" rakudo>mingw32-make rakudo>mingw32-make install
2011-10-01
■ Perl6ドキュメントを日本語に翻訳した 
Perl6公式ドキュメントの日本語版を作りましたのでお知らせいたします。コリャ英和!というソフトで機械翻訳したので変な訳も多いですが(bless→祝福しろ、die→○ね、とか)・・・まあ意味不明な箇所は原文読め、ということです。
※ OmegaTで人力翻訳していた時期もあったけど、原文の量が多すぎて諦めた
2011-01-02
■ qw()の変な使い方 
なんと、以下のコードはきちんと動作します。
foreach my $str qw(a b c d) { print $str, "\n"; }
結果
a b c d
perlのパーサーが内部でqw(a b c d)を(qw(a b c d))のように解釈するため、foreachに必須のはずの括弧が省略できてしまうのです。この奇妙な動作はperl5135deltaにあるように5.13以降のperlでは廃止されます。絶対に使わないでください。(個人的には、このままのほうが便利じゃね?と思う・・・)
2011-01-01
■ メソッド呼び出しのwantarrayはどうなるのか 
package Called; sub called { my ($class, $arg) = @_; printf "$arg: wantarray = %d defined = %d\n", wantarray, wantarray; return $class; } package main; sub func { $arg = shift; } Called->called("void called()"); () = Called->called("() = called()"); Called->called("void ->called->")->called("void ->called->called"); () = Called->called("() = ->called->")->called("() = ->called->called"); func( Called->called("func( called() )") );
出力結果
当たり前だがvoidコンテキストでwantarrayは偽(undef)になる。メソッドのチェーン(->called->called)はスカラーコンテキスト、関数呼び出しではリストコンテキストになる。
void called(): wantarray = 0 defined = 0 () = called(): wantarray = 1 defined = 1 void ->called->: wantarray = 0 defined = 1 void ->called->called: wantarray = 0 defined = 0 () = ->called->: wantarray = 0 defined = 1 () = ->called->called: wantarray = 1 defined = 1 func( called() ): wantarray = 1 defined = 1