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

投稿

3月, 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")} デバッグ用には変数名が分かり易いようにペア記法を組み合わせて、noteで標準エラー出力に書き出します(warnは例外…

部分継続チュートリアル

この文書についてこれはCommunity Scheme Wikiで公開されているcomposable-continuations-tutorial(2010年09月30日版)の日本語訳です。誤字脱字・誤訳などがありましたらコメントあるいはメールで御指摘いただけると幸いです。本訳は原文のライセンスに基づきCreative Commons Attribution-ShareAlike 2.0 Genericの下で公開されます。Original text: Copyright© 2006-2010 Community Scheme WikiJapanese 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)や部分継続(Partial continuation)もありますが、ここでは一貫して「組み合わせ可能」という用語を使います(訳注: …

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 LenzJapanese translation: Copyright© 2011 SATOH KoichiNAME"Perl 5 to 6" Lesson 28 - カリー化SYNOPSISuse 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メソッドを持ちます。これは呼び出し元のコードオブジェクトに引数を適用し、その部分適用された関数を返します。my &…

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

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 LenzJapanese translation: Copyright© 2011 SATOH KoichiNAME"Perl 5 to 6" Lesson 25 - 交差メタ演算子SYNOPSISfor <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と評価されます)を返します。MOTIVATION2つ以上のリストの取り得る組み合わせをすべて走査しなければならないことはよくあります。交差演算子はそれを1つの走査に濃縮できるので、プログラムを簡潔にし、字下げのレベルを1つ減らせます。メタ演算子としての使用法は時としてループを完全になくすことができます。SEE ALSOhttp://perlcabal.org/syn/S03.html#Cross_operators

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 LenzJapanese translation: Copyright© 2011 SATOH KoichiNAME"Perl 5 to 6" Lesson 24 - 縮約メタ演算子SYNOPSISsay [+] 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を多分ご存知でしょう。 これらとは異なり[...]は元の演算子の結合性に従うので、[/] 1, 2, 3は(1 / 2) /…

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 LenzJapanese translation: Copyright© 2011 SATOH KoichiNAME"Perl 5 to 6" Lesson 23 - クォートと構文解析SYNOPSISmy @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はqw/.../が行うように単語を分割します。これらの修飾子は自由に組み合わせることができます。例えばスカラだけ展開し、他は展開しない…

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 LenzJapanese translation: Copyright© 2011 SATOH KoichiNAME"Perl 5 to 6" Lesson 21 - 派生型SYNOPSISsubset 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; } DESCRIPTIONJavaプログラマは型のことをクラスかインタフェース(不具なクラスのようなもの)のように考えがちですが、その見方はPerl6においては狭すぎます。 型はもっと一般的に、コンテナが値に与えることができる制約です。「古典的な」制約はクラスXあるいはそれを継承したクラスのインスタンスであることです。 Perl6にもXクラスのインスタンスだとかYロールを実装しているとか、あるいはオブジェクトに対してこのコード片が真を返すといった制約があります。 最後に挙げたのが最も一般的なもので、これは派生型(Subset type)と呼ばれています:subset Even of Int where { $_ % 2 == 0 } # これで他の型名と同様にEvenが使えるようになった my Even $x = 2; my Even $y = 3; # 型不一致エラー (試してみて下さい。Rakudoは派生型を既に実装していますが、派生型に基づいた多重ディスパッチはまだ実装されて…

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 LenzJapanese translation: Copyright© 2011 SATOH Koichi注記: XMLに関する用語の誤用(「整形式」と「妥当」を混同しているなど)がありますが、あくまで例なので原文通りに残しています。NAME"Perl 5 to 6" Lesson 20 - (似非)XMLのグラマーSYNOPSISgrammar XML { token TOP { ^ <xml> $ }; token xml { <text> [ <tag> <text> ]* }; token text { <-[<>&]>* }; rule tag { '<'(\w+) <attributes>* [ | '/>' # 空タグ | '>'<xml>'</' $0 '>' # 開始タグと終了タグ ] }; token attributes { \w+ '="' <-["<>]>* '"' }; }; DESCRIPTIONこれまでの連載記事の焦点はPerl6言語であり、実装状況は気にしていませんでした。 これが空想上の言語で…

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 LenzJapanese translation: Copyright© 2011 SATOH KoichiNAME"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にマッチする)場合は\s+にマッチし、さもなくば\s*にマッチします。文字列置換において:samespace修飾子は<ws>…