スキップしてメイン コンテンツに移動

投稿

2011の投稿を表示しています

「Perlにもしあったらいいなぁと思う機能」は大体Perl6にあると思う

2011-03-19: 複数行コメントについて加筆しました。 背景 Perlにもしあったらいいなぁと思う機能 - サンプルコードによるPerl入門 を読んでて「それPerl6でできるよ」と思ったので。一応Perlです。一応。 1. ダブルクォーテーションの中で関数が展開できる機能 ダブルクォート( qq 演算子)はエスケープシーケンス、スカラ、配列、ハッシュ、関数、クロージャを展開します: "aaa { $book.title } bbb" Q クォート演算子でオレオレ展開ルールも作れます(Rakudoだとまだ動きませんが): Q:function/funcall: &func()/; Q:closure/closure: { ucfirst('hello') ~ ', world' }/; # qq//と同じ Q:qq/$scalar, @array[], %hash{}, &subroutine(), { 'closure' }/; 2. メソッドにおけるオブジェクトの名前 自身を self で参照できます: class Foo { has Str $.objective = 'world'; method greet { say "Hello, { self.objective }"; } } Foo.new.greet; # Hello, world Foo.new(:objective<Perl6>).greet; # Hello, Perl6 3. データを簡単にダンプする標準関数 オブジェクトをPerl6コードにダンプする .perl メソッドがあります: say 42.perl; # 42 say { foo => 'bar', hoge => qw/fuga piyo/ }.perl; # {"foo" => "bar", "hoge" => ("fuga", "piyo")} デバッグ用には変数名が分か

部分継続チュートリアル

この文書について これは Community Scheme Wiki で公開されている composable-continuations-tutorial (2010年09月30日版)の日本語訳です。 誤字脱字・誤訳などがありましたらコメントあるいはメールで御指摘いただけると幸いです。 本訳は原文のライセンスに基づき Creative Commons Attribution-ShareAlike 2.0 Generic の下で公開されます。 Original text: Copyright© 2006-2010 Community Scheme Wiki Japanese translation: Copyright© 2011 SATOH Koichi 本文 部分継続(Composable continuation)は継続区間を具象化することで制御を逆転させるものです。 ウンザリするほど複雑な概念を表す長ったらしいジャーゴンのように聞こえますが、実際はそうではありません。今からそれを説明します。 reset と shift という2つのスペシャルフォームを導入するところから始めましょう [1] 。 (reset expression) は特別な継続を作るなりスタックに目印を付けるなりしてから expression を評価します。簡単に言えば、 expression が評価されるとき、あとから参照できる評価中の情報が存在するということです。 実際には shift がこの情報を参照します。 (shift variable expression) は目印のついた場所、つまり reset を使った場所にジャンプし、その場所から shift を呼び出した場所までのプログラムの断片を保存します; これはプログラムの区間を「部分継続」として知られる組み合わせ可能な手続きに具象化し、この手続きに variable を束縛してから expression を評価します。 組み合わせ可能(Composable)という語はその手続きが呼び出し元に戻ってくるため、他の手続きと組み合わせられることから来ています。 Composable continuationの別名として例えば限定継続(Delimited continuation)や部分継続(Partia

Perl 5 to 6 - カリー化

これはMoritz Lenz氏のWebサイト Perlgeek.de で公開されているブログ記事 "Perl 5 to 6" Lesson 28 - Currying の日本語訳です。 原文は 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 28 - カリー化 SYNOPSIS use v6; my &f := &substr.assuming('Hello, World'); say f(0, 2); # He say f(3, 2); # lo say f(7); # World say <a b c>.map: * x 2; # aabbcc say <a b c>.map: *.uc; # ABC for ^10 { print <R G B>.[$_ % *]; # RGBRGBRGBR } DESCRIPTION カリー化、あるいは部分適用とは関数やメソッドにいくつかの引数を与えて関数を生成する処理のことです。 これは打鍵数を節約し、また他の関数にコールバック関数を渡したいときに便利です。 "Hello, World" から簡単に部分文字列を取り出せる関数が欲しいと仮定しましょう。古典的なやり方は専用の関数を書くことです: sub f(*@a) { substr('Hello, World', |@a) } assuming によるカリー化 Perl6のコードオブジェクトは assuming メソッドを持

Perl 5 to 6 - 一般的なPerl6データ処理イディオム

これはMoritz Lenz氏のWebサイト Perlgeek.de で公開されているブログ記事 "Perl 5 to 6" Lesson 27 - Common Perl 6 data processing idiom の日本語訳です。 原文は 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 27 - 一般的なPerl6データ処理イディオム SYNOPSIS # キーと値のリストからハッシュを作る: # 方法1: スライス my %hash; %hash{@keys} = @values; # 方法2: メタ演算子 my %hash = @keys Z=> @values; # 配列の各要素に真を対応づけたハッシュを作る: my %exists = @keys Z=> 1 xx *; # 値を指定された範囲に制限する。ここでは範囲は 0..10 my $x = -2; say 0 max $x min 10; # デバッグ用: 変数の内容を変数名込みでSTDERRに書き出す note :$x.perl; # 大文字小文字を区別せずにソートする say @list.sort: *.lc; # 必須アトリビュート class Something { has $.required = die "Attribute 'required' is mandatory"; } Something.new(required => 2); # エラーなし Something.new() # ブーン DESCRIPTION ある言語で生産性を発揮するには言語仕様を学ぶだけでは不十分です

Perl 5 to 6 - 例外と制御例外

これはMoritz Lenz氏のWebサイト Perlgeek.de で公開されているブログ記事 "Perl 5 to 6" Lesson 26 - Exceptions and control exceptions の日本語訳です。 原文は 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 26 - 例外と制御例外 SYNOPSIS try { die "OH NOEZ"; CATCH { say "there was an error: $!"; } } DESCRIPTION 例外はその名前に反してまったく例外的なものではありません。実際のところPerl6では通常の制御フローの一部です。 例外は潜在的なエラー(例えば0除算、存在しないメソッドの呼び出し、型チェック失敗)または die その他の関数の明示的な呼び出しによって生成されます。 例外が投げられるとプログラムは呼び出しフレームから CATCH ブロックか try ブロックを探し、スタックを完全に巻き戻します(つまりそれまでに呼び出された全部のサブルーチンから無理矢理戻ってくるということです)。 もし CATCH も try も見つからなければプログラムは終了し、運が良ければ役に立つエラーメッセージが表示されます。 どちらか一方が見つかった場合はエラーメッセージは特殊変数 $! に格納され、 CATCH ブロックが実行されます( try ブロックに CATCH ブロックがない場合、ブロックは undef を返します)。 ここまでの説明ではまだ例外が例外的なものに思えるかも知れませんが、エラー処理は些末なアプリケー

Perl 5 to 6 - 交差メタ演算子

これはMoritz Lenz氏のWebサイト Perlgeek.de で公開されているブログ記事 "Perl 5 to 6" Lesson 25 - The Cross Meta Operator の日本語訳です。 原文は 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 25 - 交差メタ演算子 SYNOPSIS for <a b> X 1..3 -> $a, $b { print "$a: $b "; } # 出力: a: 1 a: 2 a: 3 b: 1 b: 2 b: 3 .say for <a b c> X 1, 2; # 出力: a1\n a2\n b1\n b2\n c1\n c2\n DESCRIPTION 交差演算子 X は2つ以上のリストのデカルト積を返します。 つまりどういうことかというと、最初のリストから1つ取って最初の要素に、2番目のリストから1つ取って2番目の要素に、といった具合で作り得るすべての組を返します。 X の後に演算子を付けるとそれが組のすべての要素に対して適用され、その結果が代わりに返されます。 よって 1, 2 X+ 3, 6 は 1+3, 1+6, 2+3, 2+6 (当然 4, 7, 5, 8 と評価されます)を返します。 MOTIVATION 2つ以上のリストの取り得る組み合わせをすべて走査しなければならないことはよくあります。交差演算子はそれを1つの走査に濃縮できるので、プログラムを簡潔にし、字下げのレベルを1つ減らせます。 メタ演算子としての使用法は時としてループを完全になくすことができます。 SEE ALSO http

Perl 5 to 6 - 縮約メタ演算子

これはMoritz Lenz氏のWebサイト Perlgeek.de で公開されているブログ記事 "Perl 5 to 6" Lesson 24 - The Reduction Meta Operator の日本語訳です。 原文は 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 24 - 縮約メタ演算子 SYNOPSIS say [+] 1, 2, 3; # 6 say [+] (); # 0 say [~] <a b>; # ab say [**] 2, 3, 4; # 2417851639229258349412352 [\+] 1, 2, 3, 4 # 1, 3, 6, 10 [\**] 2, 3, 4 # 4, 81, 2417851639229258349412352 if [<=] @list { say "ascending order"; } DESCRIPTION 縮約メタ演算子 [...] は結合性のある中置演算子なら何でもリスト演算子に変換します。 これはあたかもリストの各要素間にその中置演算子が置かれたかのように働きます。つまり [op] $i1, $i2, @rest は $i1 op $i2 op @rest[0] op @rest[1] ... と書かれたのと同じ結果になります。 これは + 演算子を総和関数に格上げし、 ~ 演算子を(セパレータを空文字列にした) join にするなど、非常に強力な構文です。 もし関数プログラミングに触れたことがあるなら、(LispやHaskellの) foldl と foldr を多分ご存知で

Perl 5 to 6 - クォートと構文解析

これはMoritz Lenz氏のWebサイト Perlgeek.de で公開されているブログ記事 "Perl 5 to 6" Lesson 23 - Quoting and Parsing の日本語訳です。 原文は 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 23 - クォートと構文解析 SYNOPSIS my @animals = <dog cat tiger> # or my @animals = qw/dog cat tiger/; # or my $interface = q{eth0}; my $ips = q :s :x /ifconfig $interface/; # ----------- sub if { warn "if() calls a sub\n"; } if(); DESCRIPTION クォート Perl6には強力な文字列クォート機構があり、文字列のあらゆる機能を完全に制御できます。 Perl5にはシングルクォート、ダブルクォートそして qw(...) (空白で分割するシングルクォート文字列リスト)があり、さらに q(...) と qq(...) がそれぞれシングルクォートとダブルクォートの同義語になっていました。 一方のPerl6には Q というクォート演算子が定義されていて、様々な修飾子を取ります。 :b (バックスラッシュ)修飾子はバックスラッシュによる \n のようなエスケープシーケンスの展開を許し、 :s 修飾子はスカラ変数の展開を許し、 :c はクロージャ( "1 + 2 = { 1 + 2 }" )の展開を許す、などなど。また :w は q

Perl 5 to 6 - 派生型

これはMoritz Lenz氏のWebサイト Perlgeek.de で公開されているブログ記事 "Perl 5 to 6" Lesson 21 - Subset 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 21 - 派生型 SYNOPSIS subset Squares of Int where { .sqrt.Int**2 == $_ }; multi sub square_root(Squares $x --> Int) { return $x.sqrt.Int; } multi sub square_root(Num $x --> Num) { return $x.sqrt; } DESCRIPTION Javaプログラマは型のことをクラスかインタフェース(不具なクラスのようなもの)のように考えがちですが、その見方はPerl6においては狭すぎます。 型はもっと一般的に、コンテナが値に与えることができる制約です。「古典的な」制約はクラス X あるいはそれを継承したクラスのインスタンスであることです。 Perl6にも X クラスのインスタンスだとか Y ロールを実装しているとか、あるいは オブジェクトに対してこのコード片が真を返す といった制約があります。 最後に挙げたのが最も一般的なもので、これは派生型(Subset type)と呼ばれています: subset Even of Int where { $_ % 2 == 0 } # これで他の型名と同様にEvenが使えるようになった my Even $x = 2; my Even $y = 3; # 型不一致エラー (試してみて下

Perl 5 to 6 - (似非)XMLのグラマー

これはMoritz Lenz氏のWebサイト Perlgeek.de で公開されているブログ記事 "Perl 5 to 6" Lesson 20 - A grammer for (pseudo) XML の日本語訳です。 原文は 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 注記: XMLに関する用語の誤用(「整形式」と「妥当」を混同しているなど)がありますが、あくまで例なので原文通りに残しています。 NAME "Perl 5 to 6" Lesson 20 - (似非)XMLのグラマー SYNOPSIS grammar XML { token TOP { ^ <xml> $ }; token xml { <text> [ <tag> <text> ]* }; token text { <-[<>&]>* }; rule tag { '<'(\w+) <attributes>* [ | '/>' # 空タグ | '>'<xml>'</' $0 '>' # 開始タグと終了タグ ] }; token attributes { \w+ '="' <-["<>]>* '"' }; }; DESCRIPTION これまでの連載記事の焦点は

Perl 5 to 6 - 正規表現の逆襲

これはMoritz Lenz氏のWebサイト Perlgeek.de で公開されているブログ記事 "Perl 5 to 6" Lesson 19 - Regexes strike back の日本語訳です。 原文は 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 19 - 正規表現の逆襲 SYNOPSIS # 通常のマッチング: if 'abc' ~~ m/../ { say $/; # ab } # 暗黙的な:sigspace修飾子を使ったマッチング if 'ab cd ef' ~~ mm/ (..) ** 2 / { say $1; # cd } # :sigspace修飾子を使った文字列置換 my $x = "abc defg"; $x ~~ ss/c d/x y/; say $x; # abx yefg DESCRIPTION 正規表現の基本は Lesson 07 で既に述べたので、役に立つ(が体系立っていない)内容をいくらか補足します。 マッチング 正規表現マッチングのためにグラマーを書かないといけない訳ではなく、昔ながらの m/.../ はまだ動きます。 新しい兄弟分として mm/.../ 形式があり、 :sigspace 修飾子を暗黙的に有効にします。これは正規表現中の空白を <.ws> ルールで置換するものだったことを思い出して下さい。 このルールのデフォルトは、2つの単語文字で囲まれている(つまりそれぞれが \w にマッチする)場合は

Perl 5 to 6 - スコープ

これはMoritz Lenz氏のWebサイト Perlgeek.de で公開されているブログ記事 "Perl 5 to 6" Lesson 18 - Scoping の日本語訳です。 原文は 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 18 - Scoping SYNOPSIS for 1 .. 10 -> $a { # ここは$aが見える } # ここは$aが見えない while my $b = get_stuff() { # ここは$bが見える } # ここでも$bが見える my $c = 5; { my $c = $c; # ここで$cがundefになる } # ここでは$cは5 my $y; my $x = $y + 2 while $y = calc(); # まだ$xが見える DESCRIPTION 字句的スコープ Perl6のスコープはPerl5に非常によく似ています。ブロックは新しい字句的スコープを導入します。 変数名は最も内側の字句的スコープから探索され、もし見つからなければ一つ外側のスコープを、といった手順で探索されます。 Perl5と同様に my 変数は完全な字句的スコープ変数であり、 our 宣言はパッケージ変数に字句的スコープを持った別名を作ります。 ただしちょっとした違いがあります: 変数はブロックの宣言された位置より後で可視であり、ブロックのヘッダ(例えば while ループの条件節など)で宣言された変数はブロック内に限定されません。 スコープを限定したいときはブロックの形式的パラメータが使えます: if calc() -> $result { # ここでは$

Perl 5 to 6 - Unicode

これはMoritz Lenz氏のWebサイト Perlgeek.de で公開されているブログ記事 "Perl 5 to 6" Lesson 17 - Unicode の日本語訳です。 原文は 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 17 - Unicode SYNOPSIS (なし) DESCRIPTION Perl5のUnicodeモデルは大きな弱点に悩んでいました: バイナリとテキストデータに同じ型を使っていたのです。 プログラムがネットワークソケットから512バイト読み込んだとすると、それは当然バイト列になります。しかしそれに対して(Perl5で) uc を呼ぶとテキストとして扱われます。 推奨されている方法は最初にバイト列をデコードすることですが、サブルーチンがそれを引数として受け取る段階では、それがエンコードされているのかどうか、つまりblobとして扱うべきかテキストとして扱うべきか確実に判断することは不可能です。 一方、Perl6は単なるバイトのコレクションである Buf 型を提供します。また Str は論理的な文字のコレクションです。 論理的な文字という用語にはいささか説明が必要です。正確に言うと、 Str は様々な水準の見方ができるオブジェクトです: Byte 、 CodePoint (Unicodeコンソーシアムが番号を割り当てたものすべて)、 Grapheme (書記素; 文字として目に見えるもの)、 CharLingua (言語定義文字)。 例えば16進数表記で 61 cc 80 は(当然)3バイトのバイト列を構成します。しかしこれは2つのコードポイント LATIN SMALL LETTER A (U+0041)と COMB

Perl 5 to 6 - 列挙型

これはMoritz Lenz氏のWebサイト Perlgeek.de で公開されているブログ記事 "Perl 5 to 6" Lesson 16 - Enums の日本語訳です。 原文は 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 16 - 列挙型 SYNOPSIS enum bit Bool <False True>; my $value = $arbitrary_value but True; if $value { say "Yes, it's true"; # 表示される } enum Day ('Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun'); if custom_get_date().Day == Day::Sat | Day::Sun { say "Weekend"; } DESCRIPTION 列挙型は用途の広い獣です。定数の列挙からなる低レベルのクラスであり、定数は典型的には整数や文字列です(が任意のものが使えます)。 これらの定数は派生型やメソッド、あるいは通常の値のようにふるまいます。 but 演算子でオブジェクトに結びつけることができ、これによって列挙型を値に「ミックスイン」できます: my $x = $today but Day::Tue; 列挙型の型名を関数のように使うこともでき、引数として値を指定できます: $x = $today but Day($weekday);

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

Perl 5 to 6 - MAINサブルーチン

これはMoritz Lenz氏のWebサイト Perlgeek.de で公開されているブログ記事 "Perl 5 to 6" Lesson 14 - The MAIN sub の日本語訳です。 原文は 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 14 - MAINサブルーチン SYNOPSIS # ファイル doit.pl #!/usr/bin/perl6 sub MAIN($path, :$force, :$recursive, :$home = '~/') { # do stuff here } # コマンドライン $ ./doit.pl --force --home=/home/someoneelse file_to_process DESCRIPTION サブルーチン呼び出しと典型的なUNIXプログラムのコマンドラインからの起動は、見た目にはとてもよく似ています: 位置的な引数やオプション、名前付き引数を与えられます。 この類似点のおかげで、Perl6はコマンドラインを処理してサブルーチン呼び出しに変換してくれます。 スクリプトは通常通り実行され(この時点で @*ARGS に格納されているコマンドライン引数を書き換えることもできます)、その後もし存在すれば MAIN サブルーチンが呼び出されます。 コマンドライン引数が MAIN サブルーチンの形式的パラメータにマッチしない場合、自動的に生成されたUsageが表示されます。 コマンドラインオプションはサブルーチン引数に以下のようにマップされます: -name :name -name=value :nam

Perl 5 to 6 - カスタム演算子

これはMoritz Lenz氏のWebサイト Perlgeek.de で公開されているブログ記事 "Perl 5 to 6" Lesson 13 - Custom Operators の日本語訳です。 原文は 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 13 - カスタム演算子 SYNOPSIS multi sub postfix:<!>(Int $x) { my $factorial = 1; $factorial *= $_ for 2..$x; return $factorial; } say 5!; # 120 DESCRIPTION 演算子は変わった名前を持ち、優先度とか結合性のような付加的な属性が少しだけ付いた関数です。 Perl6は通常 term infix term というパターンに従います。 term は前置演算子が前に付いていたり、後置演算子や後置接周(postcircumfix)演算子が後に付いたりしていても構いません。 1 + 1 中置 +1 前置 $x++ 後置 <a b c> 接周 @a[1] 後置接周 演算子の名前は「特別な」文字に限らず、空白以外なら何でも使えます。 演算子の長い名前はそのタイプの後にコロンとリテラルあるいはシンボルのリストが付きます。 例えば infix:<+> は 1+2 で使われている演算子です。 もう一つの例は postcircumfix:<[ ]

Perl 5 to 6 - 遅延性

これはMoritz Lenz氏のWebサイト Perlgeek.de で公開されているブログ記事 "Perl 5 to 6" Lesson 12 - Laziness の日本語訳です。 原文は 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 12 - 遅延性 SYNOPSIS my @integers = 0..*; for @integers -> $i { say $i; last if $i % 17 == 0; } my @even := map { 2 * $_ }, 0..*; my @stuff := gather { for 0 .. Inf { take 2 ** $_; } } DESCRIPTION Perlプログラマは怠けがちです。彼らが使うリストも。 ここで怠惰という言葉が意味するのは、評価が可能な限り遅延されるということです。 @a := map BLOCK, @b のようなコードを書いたとき、ブロックは一切実行されません。 @a の要素にアクセスしようとしたときだけ map は実際にブロックを実行し、必要とされる分だけ @a を埋めます。 代入ではなくバインディングを使っていることに注意して下さい: 配列への代入は先行評価を強制することがあります(コンパイラがリストの無限性に気づかない限り; 無限リスト検出の詳細はまだ固まっていません)。 バインディングはそのようなことがありません。 遅延性は無限リストの取り扱いを可能にします: 引数すべてに操作を行うようなことさえしなければ、評価された要素に必要なだけのメモリしか必要としません。 しかし落とし穴があります: 長さの

Perl 5 to 6 - Perl5の演算子に対する変更

これはMoritz Lenz氏のWebサイト Perlgeek.de で公開されているブログ記事 "Perl 5 to 6" Lesson 11 - Changes to Perl 5 Operators の日本語訳です。 原文は 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 11 - Perl5の演算子に対する変更 SYNOPSIS # ビット演算子 5 +| 3; # 7 6 +^ 3 # 6 5 +& 3; # 1 "b" ~| "d" # 'f' # 文字列連結 'a' ~ 'b' # 'ab' # ファイルテスト if '/etc/passwd' ~~ :e { say "exists" } # 繰り返し 'a' x 3 # 'aaa' 'a' xx 3 # 'a', 'a', 'a' # 3項演算子 $a == $b ?? 2 * $a !! $b - $a # 連結比較 if 0 <= $angle < 2 * pi { ... } DESCRIPTION 数値演算子( + , - , / , * , ** , % )はすべて元のままです。 | 、 ^ 、 & はジャンクションの生成に使われるので、ビット演算子は構文が変更されました。 それらはデータプレフィクスを伴い、例えば

Perl 5 to 6 - コンテナと値

これはMoritz Lenz氏のWebサイト Perlgeek.de で公開されているブログ記事 "Perl 5 to 6" Lesson 10 - Containers and Values の日本語訳です。 原文は 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 10 - コンテナと値 SYNOPSIS my ($x, $y); $x := $y; $y = 4; say $x; # 4 if $x =:= $y { say '$x and $y are different names for the same thing' } DESCRIPTION Perl6はコンテナと、コンテナに格納できる値を区別して取り扱います。 通常のスカラ変数は一種のコンテナで、型制約やアクセス制約(読み取り専用とか)などの属性を持ち、他のコンテナの別名として使えます。 値をコンテナに格納することを代入と呼び、コンテナに別名をつけることをバインディングと呼びます。 my @a = 1, 2, 3; my Int $x = 4; @a[0] := $x; # @a[0]と$xは同じ変数 @a[0] = 'Foo'; # エラー 「型チェック失敗」 Int や Str のような型は不変、つまりこれらの型のオブジェクトは変更できません。しかしこれらの値を保持する変数(コンテナ)は変更できます: my $a = 1; $a = 2; # 驚くにはあたりません バインディングは ::= 演算子を使ってコンパイル時に行うこともできます。 2つの変数がバインディングされているか調べるに

Perl 5 to 6 - 比較とマッチング

これはMoritz Lenz氏のWebサイト Perlgeek.de で公開されているブログ記事 "Perl 5 to 6" Lesson 09 - Comparing and Matching の日本語訳です。 原文は 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 09 - 比較とマッチング SYNOPSIS "ab" eq "ab" True "1.0" eq "1" False "a" == "b" True "1" == 1.0 True 1 === 1 True [1, 2] === [1, 2] False $x = [1, 2]; $x === $x True $x eqv $x True [1, 2] eqv [1, 2] True 1.0 eqv 1 False 'abc' ~~ m/a/ True 'abc' ~~ Str True 'abc' ~~ Int False Str ~~ Any True Str ~~ Num False 1 ~~ 0..4 True -3 ~~

Perl 5 to 6 - ジャンクション

これはMoritz Lenz氏のWebサイト Perlgeek.de で公開されているブログ記事 "Perl 5 to 6" Lesson 08 - Junctions の日本語訳です。 原文は 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 08 - ジャンクション SYNOPSIS if $x eq 3|4 { say '$x is either 3 or 4' } say ((2|3|4)+7).perl # (9|10|11) DESCRIPTION ジャンクションは順序づけられていない値の重ね合わせです。ジャンクションに対する演算はジャンクションの各要素に対して別々に実行(並列化されるかも知れません)され、その結果は同じ型のジャンクションに組み立てられます。 複数あるジャンクション型は真理値コンテキストで評価されたときのみ違いが出ます。型には any 、 all 、 one 、 none があります。 型 中置演算子 any | one ^ all & 1 | 2 | 3 は any(1..3) と同じです。 my Junction $weekday = any <Monday Tuesday Wednesday Thursday Friday Saturday Sunday> if $day eq $weekday { say "See you on $day"; } この例では $day と 'Monday' 、 $day と 'Tu

Perl 5 to 6 - 正規表現(またの名をルール)

これはMoritz Lenz氏のWebサイト Perlgeek.de で公開されているブログ記事 "Perl 5 to 6" Lesson 07 - Regexes (also called "rules") の日本語訳です。 原文は 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 07 - 正規表現(またの名をルール) SYNOPSIS grammar URL { token TOP { <schema> '://' [<ip> | <hostname> ] [ ':' <port>]? '/' <path>? } token byte { (\d**{1..3}) <?{ $0 < 256 }> } token ip { <byte> [\. <byte> ] ** 3 } token schema { \w+ } token hostname { (\w+) ( \. \w+ )* } token port { \d+ } token path { <[ a..z A..Z 0..9 \-_.!~*'():@&=+$,/ ]>+ } } my $match = URL.parse('http:/

Perl 5 to 6 - コンテキスト

2011-02-27: コメント欄で既に改訂された仕様の指摘がありました ので一部補足しました。 id:uasi に感謝します。 これはMoritz Lenz氏のWebサイト Perlgeek.de で公開されているブログ記事 "Perl 5 to 6" Lesson 06 - Contexts の日本語訳です。 原文は 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 06 - コンテキスト SYNOPSIS my @a = <a b c> my $x = @a; say $x[2]; # c say (~2).WHAT # Str() say +@a; # 3 if @a < 10 { say "short array"; } DESCRIPTION 次のように書いたとき、 $x = @a Perl5では $x は @a より少ない情報—— @a の要素数だけ——しか持ちません。 すべての情報を保存しておくためには明示的にリファレンスを取る必要があります: $x = \@a Perl6ではこれらは反対になります: デフォルトでは何も失うことなく、スカラ変数は配列を単に格納します。 これは一般要素コンテキスト(Perl5で scalar と呼ばれていたもの)及びより特化された数値、整数、文字列コンテキストの導入によって可能となりました。無効コンテキストとリストコンテキストは変更されていません。 特別な構文でコンテキストを強制できます。 構文 コンテキスト ~stuff 文字列 ?stuff 真理値 +stuff

Perl 5 to 6 - オブジェクトとクラス

これはMoritz Lenz氏のWebサイト Perlgeek.de で公開されているブログ記事 "Perl 5 to 6" Lesson 05 - Objects and Classes の日本語訳です。 原文は 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 05 - オブジェクトとクラス SYNOPSIS class Shape { method area { ... } # リテラル '...' has $.colour is rw; } class Rectangle is Shape { has $.width; has $.height; method area { $!width * $!height; } } my $x = Rectangle.new( width => 30.0, height => 20.0, colour => 'black', ); say $x.area; # 600 say $x.colour; # black $x.colour = 'blue'; DESCRIPTION Perl6にはPerl5よりずっと洗練されたオブジェクトモデルがあります。クラス、ロール、アトリビュートやメソッドのためのキーワードがあり、カプセル化されたプライベートなアトリビュートやメソッドがあります。 これは(Perl6のオブジェクトシステムに影響を受けた)Perl5の Moose モ

Perl 5 to 6 - サブルーチンとシグネチャ

これはMoritz Lenz氏のWebサイト Perlgeek.de で公開されているブログ記事 "Perl 5 to 6" Lesson 04 - Subroutines and Signatures の日本語訳です。 原文は 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 04 - サブルーチンとシグネチャ SYNOPSIS # シグネチャなしのサブルーチン——Perl5風 sub print_arguments { say "Arguments:"; for @_ { say "\t$_"; } } # 固定引数の型指定付きシグネチャ sub distance(Int $x1, Int $y1, Int $x2, Int $y2) { return sqrt ($x2-$x1)**2 + ($y2-$y1)**2; } say distance(3, 5, 0, 1); # デフォルト引数 sub logarithm($num, $base = 2.7183) { return log($num) / log($base) } say logarithm(4); # 第2引数はデフォルトを利用 say logarithm(4, 2); # 明示的な第2引数 # 名前付き引数 sub doit(:$when, :$what) { say "doing $what at $when"; } doit(what => 'stuff', when => 'once'); # '

Perl 5 to 6 - 基本制御構造

これはMoritz Lenz氏のWebサイト Perlgeek.de で公開されているブログ記事 "Perl 5 to 6" Lesson 03 - Basic Control Structures の日本語訳です。 原文は 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 03 - 基本制御構造 SYNOPSIS if $percent > 100 { say "weird mathematics"; } for 1..3 { # $_をループ変数として使う say 2 * $_; } for 1..3 -> $x { # 明示的なループ変数を使う say 2 * $x; } while $stuff.is_wrong { $stuff.try_to_make_right; } die "Access denied" unless $password eq "Secret"; DESCRIPTION ほとんどのPerl5の制御構造はPerl 6でもよく似ています。 一番大きな見た目の変化は if 、 while 、 for などの後にカッコが必要なくなったことです。 正確には、条件をカッコで囲むのは非推奨です。 分岐 if はほとんど変わっていません。相変わらず elsif や else の節を付けることができます。 unless もありますが、 else 節を付けることができなくなりました。 if $sheep == 0 { say "How boring"; } elsif $sheep ==

Perl 5 to 6 - 型

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