2011-02-27: コメント欄で既に改訂された仕様の指摘がありましたので一部補足しました。id:uasiに感謝します。
これはMoritz Lenz氏のWebサイトPerlgeek.deで公開されているブログ記事"Perl 5 to 6" Lesson 02 - Typesの日本語訳です。
原文は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 02 - 型
SYNOPSIS
my Int $x = 3;
$x = "foo"; # エラー
say $x.WHAT; # 'Int()'
# 型チェック:
if $x ~~ Int {
say '$x contains an Int'
}
DESCRIPTION
Perl6には型があります。すべてが何らかの形のオブジェクトであり、型を持ちます。変数は型制約を持つことができますが、必須ではありません。
知っておくべきいくつかの基本的な型があります:
'a string' # Str
2 # Int
3.14 # Rat (有理数)
(1, 2, 3) # Seq
「通常の」組み込み型はすべて大文字で始まります。「通常の」型はすべてAny
を継承し、他も含めたすべての型はObject
Mu
(コメントで指摘があったので修正しました。多謝。ちなみに「無」から来ているそうです)を継承します。
型名を変数宣言に加えることで、変数が保持できる値の型に制約をつけられます。
my Numeric $x = 3.4;
my Int @a = 1, 2, 3;
「間違った」型(与えられた型でもその派生型でもない型)の値を変数に代入しようとするとエラーになります。
配列に対する型宣言はその要素に対して適用されるので、my Str @s
は文字列だけを格納できる配列になります。
いくつかの型は更に詳細な型の族を表します。例えば整数、有理数と浮動小数(Num
型)はNumeric
型を構成します。
イントロスペクション
.WHAT
メソッドを呼ぶことでインスタンスの型を知ることができます。
say "foo".WHAT; # Str()
ただし、もしインスタンスが与えられた型を継承しているか確認したいのなら別の方法があります。 継承関係も考慮してくれるのでこちらの方がオススメです:
if $x ~~ Int {
say 'Variable $x contains an integer';
}
MOTIVATION
型システムの詳細をすべて完全に理解することは簡単ではありませんが、型が必要な理由があります:
安全なプログラミング
インスタンスがある型であると宣言すれば然るべき処理を実行することを確信できます。確認の必要はありません。
最適化可能性
コンパイル時に型情報があれば然るべき最適化を行うことができます。 Perl6は必ずしもCより遅くなりません。原理的には。
拡張性
型情報と多重ディスパッチによって、特定の型に対して演算を簡単に再定義できます。
ルートクラスの名前は Object から Mu に変更されました( http://perlcabal.org/syn/S02.html#The_Mu_type )。
返信削除補足しました。ご指摘ありがとうございます。
返信削除