2008年11月23日日曜日

Perl 6超入門(その3)Perl 5との基本的な違い

Perl Seminar NYという集まりでPerl 6の文法をおさらいした。会場で習ってきたことをインストールしたてのPerl 6を使って自分で試してみる。

まずはバージョン表示

% ./perl6 -v
This is Rakudo Perl 6, revision 0 built on parrot 0.8.1
for darwin-thread-multi-2level.

Copyright 2006-2008, The Perl Foundation.

%

文字列連結

Perl 5の「.」は「~」になった。メソッド呼び出しが「obj->method()」から「obj.method()」になったため。

Perl 5

my $x = 'a';
my $y = 'b';
print $x . $y; # abを表示

Perl 6

my $x = 'a';
my $y = 'b';
say $x ~ $y;

三項演算子(条件演算子)

「条件 ? 正の場合の値 : 偽の場合の値」という書き方はCからの伝統だったが、「条件 ?? 正の場合 !! 偽の場合」になった。

Perl 5

my $x = 1;
print $x == 1 ? 'yes' : 'no'; # yesを表示

Perl 6

my $x = 1;
say $x == 1 ?? 'yes' !! 'no';

配列に対するx演算子はxx

Perl 6

my @array = (1, 2, 3);
my @longarray = @array xx 3;
say join',', @longarray; # 1,2,3,1,2,3,1,2,3を表示

ジャンクション

Perl 6

「3」は「1または2または3」にマッチするので「yes」を表示する。

if (3 == (1 | 2 | 3)) {
say "yes";
}
else {
say "no";
}

「1かつ2かつ3」にはマッチしないので「no」を表示する。

if (3 == (1 & 2 & 3)) {
say "yes";
}
else {
say "no";
}

その他

エラーメッセージが(まだ)不親切。セミナーの会場でもエラーメッセージがわからずにみんなではまった。

たとえば、これを見せられて「=」ではなくて「==」にしなければいけないんだな、とわかるのは無理だ。ドキュメントの整備はこれから行われるとのこと。

% ./perl6 -e 'say "yes" if 3 = (1|2|3)'   
Method 'lvalue' not found for invocant of class 'PAST;Val'
current instr.: 'parrot;PAST;Compiler;as_post' pc 2924 (src/PAST/Compiler.pir:742)
called from Sub 'parrot;PAST;Compiler;if' pc 3461 (src/PAST/Compiler.pir:934)
called from Sub 'parrot;PAST;Compiler;post_children' pc 1783 (src/PAST/Compiler.pir:368)
called from Sub 'parrot;PAST;Compiler;as_post' pc 2060 (src/PAST/Compiler.pir:500)
called from Sub 'parrot;PAST;Compiler;post_children' pc 1783 (src/PAST/Compiler.pir:368)
called from Sub 'parrot;PAST;Compiler;pirop' pc 3061 (src/PAST/Compiler.pir:796)
called from Sub 'parrot;PAST;Compiler;post_children' pc 1783 (src/PAST/Compiler.pir:368)
called from Sub 'parrot;PAST;Compiler;as_post' pc 2408 (src/PAST/Compiler.pir:614)
called from Sub 'parrot;PCT;HLLCompiler;compile' pc 434 (src/PCT/HLLCompiler.pir:303)
called from Sub 'parrot;PCT;HLLCompiler;eval' pc 868 (src/PCT/HLLCompiler.pir:502)
called from Sub 'parrot;PCT;HLLCompiler;command_line' pc 1450 (src/PCT/HLLCompiler.pir:774)
called from Sub 'parrot;Perl6;Compiler;main' pc 16140 (perl6.pir:168)
%

関連記事

0 件のコメント:

コメントを投稿