rakudo入れてみた

そういえばMooseを少しいじったあたりでperl全然触って無かった。まったくmodernについていけてない。今どうなってるのかなーとかなり気になったので rakudo入れてみることにした。

getting

最近github経由が多かったものだから、目が勝手にgrepしてしまって、思わず先走ってfrom ココ

 % git clone git://github.com/rakudo/rakudo.git

から入れてしまってから「docsとかあるし、あんたみたいなトーシロはrakudo-star拾いなさい」とか書いてあることに気がつく(マヌケ)。まあいいや、と両方拾いながら

 % perl ./Configure.pl --gen-parrot

しろといわれたのでしてから make。なんかつくってる。

howtostart

その間に情報収集。
何を見たらいいのかさぱりーさんだったので、とりあえず素直にdocsのUsing Perl 6 をひも解きながら perl6wikiをチラチラ中。テニストーナメントのあれをいれてみる。
しかし、

===SORRY!===
too few positional arguments: 2 passed, 3 (or more) expected

とか出ちゃってなによこれ状態。行番号もないし、んえ? そもそもarity 3な関数なんて使って無いような。

bisection

さてな、始めたばかりでツール類とかもさっぱり。結局しかたがないので二分コメントアウト法(?)で追ってみると。どうやらここが、、、、ってアンタオイ思いっきりTYPOってる^^;

for @sorted -> $n {
    say "$n has won %matches{%n} matches and %sets{$n} sets";
    #                        __

なおしたら上手く動いた。が、しかしなんだねあのエラーメッセージ、と言うところで悩み始める。予想的にはこのsay全体が必要とするパラメータがn, matches, sets で 3 arguments expectedなのかな・・・とか。でもそれなら 2 passed がよーわからない。
実際類似コードを for の外に書いた場合は "Any()" が表示されて死亡までには至らない。どーなってんだ。イテレータ節には何か魔法が??

parrot

オウムサンは一体どういうものなのか、ここまで全然考えずにやってたんだけど、どうやらparrotにおける言語エンジンの実体というのはpbcと呼ばれるファイルに入っているらしい。perl6 だと src/gen/perl6.pbcにあった。中身はバイナリ。よくわかんない。

parrot <options> -- src/gen/perl6.pbc ./solve.pl

とりあえずこいつに何とかアセンブリをダンプさせられないかとか考え始める。
その前にいろいろ追いかけてみる。そもそも too few positional... を出しているのはどうやらその名も args.c:fill_params らしい。
あとparrotのテストコード中におもしろそうなの見つけた。

pir_error_output_like( <<'CODE', <<'OUTPUT', "argc mismatch, too few" );
.sub main :main
    .include "errors.pasm"
    errorson .PARROT_ERRORS_PARAM_COUNT_FLAG
    $P0 = new 'String'
    $P0 = "hello\n"
    find_name $P1, "foo"
    set_args "0", $P0
    invokecc $P1
.end
.sub foo
    get_params "0,0", $P0, $P1
    print $P0
.end
CODE
/too few positional arguments/
OUTPUT

ほう、こんな感じのasmなのかparrot。pasmというらしい。わかりやすい。callするたびにfind_name 毎回しなきゃなのか。なんか変。まあいいや。
ともかくdumpとりさえすればあとは答えはすぐだな、、、というところで、、、
<今ココ。朝食作らなきゃ・・・だった>