2011年2月26日土曜日

Perl 5 to 6 - ツイジル

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク

これはMoritz Lenz氏のWebサイトPerlgeek.deで公開されているブログ記事"Perl 5 to 6" Lesson 15 - Twigilsの日本語訳です。

原文はCreative Commons Attribution 3.0 Germanyに基づいて公開されています。

本エントリにはCreative Commons Attribution 3.0 Unportedを適用します。

Original text: Copyright© 2008-2010 Moritz Lenz

Japanese translation: Copyright© 2011 SATOH Koichi

NAME

"Perl 5 to 6" Lesson 15 - ツイジル

SYNOPSIS

class Foo {
    has $.bar;
    has $!baz;
}

my @stuff = sort { $^b[1] <=> $^a[1]}, [1, 2], [0, 3], [4, 8];
my $block = { say "This is the named 'foo' parameter: $:foo" };
$block(:foo<bar>);

say "This is file $?FILE on line $?LINE"

say "A CGI script" if %*ENV.exists('DOCUMENT_ROOT');

DESCRIPTION

いくつかの変数にはツイジルという第2のシジルがあります。これは基本的にはその変数が「普通」ではないということです。違いはいくつかあり、例えばスコープの違いなどです。

オブジェクトのパブリックな属性とプライベートな属性がそれぞれ.!というツイジルを持つことは既に紹介しました; それらは通常の変数ではなくselfに結びつけられています。

ツイジル^はPerl5で例外的に扱われていたケースを一般化します。次のように書けます

# 注意: Perl5のコードです
sort { $a <=> $b } @array

$a$bstrictプラグマに特別扱いされていました。Perl6には自己宣言された位置的パラメータというコンセプトがあり、このパラメータがツイジル^を持ちます。 これはブロックのシグネチャリストに書かれない位置的パラメータで、辞書順(アルファベット順)に引数を割り当てられます:

my $block = { say "$^c $^a $^b" };
$block(1, 2, 3);                # 3 1 2

したがってこのように書けます

@list = sort { $^b <=> $^a }, @list;
# あるいは:
@list = sort { $^foo <=> $^bar }, @list;

どこにも特別扱いはありません。

位置的引数と名前付き引数の対称性を保つため、ツイジル:が名前付きパラメータに対して同様に働きます。 したがって次の2行はほぼ等価です:

my $block = { say $:stuff }
my $sub   = sub (:$stuff) { say $stuff }

ツイジル?は変数や定数がコンパイル時に確定できることを意味します。 例えば$?LINEは現在の行番号(以前は__LINE__でした)であり、$?DATADATAセクションのファイルハンドルです。

コンテキスト変数にはツイジル*でアクセスできます。なので$*IN$*OUTは動的に上書きできます。

疑似ツイジルとして<があり、$<capture>のように使われます。これは正規表現マッチオブジェクトにアクセスする$/<capture>の省略記法です。

MOTIVATION

Perl5のperlvarドキュメントを読めば、膨大な数の変数があることが分かります。 それらの多くはグローバル変数で、プログラムに与える影響も様々です。

ツイジルはそれら特殊変数にある程度の秩序を与える試みであり、また一方で特別扱いされる部分を減らします。 オブジェクトの属性の場合はself.var$.var(とか@.varとかなんとか)と略記できるようにします。

つまるところ、悪化した「句読点ノイズ」はプログラムをよりいっそう一貫性ある、読み易いものにします。

0 コメント:

コメントを投稿