インタラクティブな実行環境を使おう

risou
2010-12-07

REPL(Read-Eval-Print Loop) は使い慣れない言語はもちろん、使い慣れた言語でも「あれ? こう書いたらどうなるんだっけ?」という状況などで有用な環境です。

Perl 5 には、 Devel::REPL というインタラクティブに Perl を実行するためにモジュールがありますが、 Perl 6 は標準でインタラクティブな実行環境を備えています。

使い方

インタラクティブモードでの起動は、 perl6 コマンドをパラメータ、オプションなしで実行するだけ可能です。

$ perl6
>

perl6 コマンドを実行すると、「>」だけの行が表示されますね。ここでユーザからの perl スクリプトを受け付け、スクリプトの処理結果を標示してくれます。

たとえば2日目の記事にあった「12月25日まであと何日?」を計算するのは、以下のように書くだけです。

$ perl6
> Date.new('2010-12-25') - Date.today
13
>

もちろん、モジュールを利用することもできます。5日目の記事で作った Foo.pm を使ってみましょう。

$ perl6
> use Foo
P
> say Foo.new.foo;
foo
>

簡単ですね。

注意

REPL を使うにあたって、一つ注意しておくべきことがあります。本家の Perl 6 Advent Calendar でも Day 4 - The Sequence Operators で少し触れられていますが、無限リストなどを評価するとレスポンスが返ってこなくなり、そこで止まってしまいます。

$ perl6
> my @fib := 0, 1, -> $a, $b { $a + $b } ... *;

^C
$ 

上の例では、 @fib に遅延評価リストを代入していますが、 REPL が入力したスクリプトの結果を出力しようとするために評価が行われてしまい、結果として無限にフィボナッチ数列の計算を続けてしまっています。以下のように書くことで、このような状況を回避できます。

$ perl6
> my @fib := 0, 1, -> $a, $b { $a + $b } ... *; 1;
1
>

REPLが出力する対象は、最後のステートメントなので、上記の場合、 "1;" が評価されて、 "1" が出力されます。