Lambda & Iterator

| コメント(0) | トラックバック(0)

Nyaruru の日記で面白そうなことが書かれています。『C# 3.0 と while(true) と Iterator』 です。俎上に上っているのはテキストファイルから複数行のテキストを一行づつ読み取る処理です。へぼろっぱぁの『少数派なのはわかっています』に反応してのものなんでしょうけど。元々のは while(継続条件) と for と、while(true) でループ内に脱出条件を仕込むパターンですが。当然ながら Nyaruru さんのは C# の yield を使ったものです。

yield というのは反復子を簡単に実装するためのキーワードで IEnumerable インタフェースの実装内で使えます。yield return は WisdomSoft の『yield キーワード』に見られるようにかなり独特のものです。列挙を処理する場合、手続き言語の哲学なら内部でカプセル化された動的な配列をバッファに返された値を保存し、そこからオブジェクトを生成するという形になろうかと思います。ところが C# のそれは内部でコルーチンになっているんですね。コルーチンというのはいったん処理を中断した後、続きから処理を再開できるものです。一般的なサブルーチンでは return で戻してしまえば処理は再開されません。ところがコルーチン化されているのでいったん値を返してもそこからまた処理を再開できるわけです。コルーチンを実装した言語は Wikipedia によれば Modula-2、Simula、Icon、Lua、C# です。この中で実用としてある程度大量に用いられている言語としては Lua と C# が残るでしょう。

そういう意味では、C# は恐らく、手続き言語・オブジェクト指向言語というくくりに関わらず便利そうであればどんどん取り込んでいる節があります。そして、その方向性は恐らく、実用志向です。実際、件のC# 3.0~のアーティクルでも最終的にはラムダ式などの LINQ のフィーチャーをふんだんに使った物になっています。ラムダ式は C# 3.0 で実装された特徴的な機能の一つです。例えばこういうものです。

x=>x*x

この場合だと、x を与えて x の2乗を返す式の参照が帰ることになります。この参照は他の関数に値として与えることができます。ただ、普通の匿名関数と違って、式木として扱えます。匿名関数の場合、内部的には IL にコンパイルされてしまうのでそういった柔軟性は期待できません。式木にできればこの辺は中でいろいろ使えます。この辺は『関数言語由来の新機能』が面白いかと。

トラックバック(0)

トラックバックURL: http://www.cworld2000.com/cgi-bin/mt/mt-tb.cgi/384

コメントする

Recent Tracks

gorn708's Profile Page

このブログ記事について

このページは、gornが2008年1月11日 13:51に書いたブログ記事です。

ひとつ前のブログ記事は「地獄少女、復活。」です。

次のブログ記事は「風の聖痕 Ignition 5 幸せなイチニチ」です。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。

Adwords