遅延Enumerableに関連して Enumeratorを返す C# 3.0 の LINQ がまさにそれですね. 一歩進んで delegate-t..">コメントで教えていただいた LINQ(Language Integrated Query)だが、 C#だとこんな感じらしい。
var 学籍番号前半名 = from p in 学生名簿 where p.学生番号 <= 15 orderby p.学生番号 select p.名;
ふむ、だけどこれならRubyで
学籍番号前半名 =
学生名簿.
select{|p| p.学生番号 <= 15}.
sort_by{|p| p.学生番号}.
collect{|p| p.名}
で実現できるよね、
各節に当たるものが独立なので、同じパラメータを何度も指定する必要があることと、 効率良く実装するのがちょっと大変ということは除くとして。
ブロック万歳。
だが、「|p|」が何度も登場するのは確かにちょっとうっとうしいかも。 ruby-talkで話題になっていた「implicit block parameter」(具体的にはGroovyの「it」)が欲しくなるかも。
そうすると、こうなる
学籍番号前半名 =
学生名簿.
select{it.学生番号 <= 15}.
sort_by{it.学生番号}.
collect{it.名}
あるいは、一連のブロックで共通に使うパラメータを用意すると言う手もあるかも。 今は文法、思いつかないけど。
いずれにしても、LINQいらないじゃん。
後はLINQっぽいものを効率良く実装する仕組みだな。
あ、でも、上記のページで紹介されている「C# 3.0の新機能」はどれも面白い。 「面白いけど、ほんとに(言語レベルで)必要?」というものが多いけど。
もうちょっと考えてみよう。
ディスカウントストアで「シガーソングライター」のようなものが、 安売りしていたので思わず購入。4980円。
外見も含めてほぼ同じ(OEM?)のようだが、再生順序が謎(シガーソングライターはファイル名順らしい)。 ドキュメントには登録順と書いてあるのだが、どうもそうでもないようだ。 FATファイルシステムのファイル取得順ってなにかあったっけ?
fatsortとかを導入してみればよいのか。
ユーザインタフェースについては気に入らない点が二つ。
前者はコスト的に記憶系を一切持っていないだろうから、しかたないとしても、 後者は手抜き過ぎかな。
「面白いけど、ほんとに(言語レベルで)必要?」については
アンダース ヘルスバーグへのインタビューが参考になると思います。
http://blog.inomata.lolipop.jp/?eid=218193
面白いインタビューですね。LINQについては前半のインタビューにおける
クエリの文法のほうが読みやすい。構文的には単なる化粧板だと
してもね。即座にメソッド呼び出しに置き換えられるのは、
foreachループが「whileループでの列挙オブジェクト取得」に置
き換えられるようなのと同じだ。でも高レベルで考えるのには便
利だ。
が、答えなんでしょうね。もっとも、LINQの文法が「高レベルで考えるのに便利」と言いたいならもっとSQLに似せるべきだったと思いますけど(selectの位置とか)。VBではもうちょっと似てるみたいですね。
あと、以下の部分が面白かったです。
ああ、まさに。それに、正直、まずは認めるべきときに認めてお
くよ。僕は完全に新しい何かを発明したわけじゃない。全てはラ
ムダ式とかラムダ計算とか言われるものに基づいているんだ。そ
れは関数プログラミングの世界に何十年も前から存在していた。
でもなぜか、主流のプログラミング言語においては日の目を見て
こなかったんだけど。
そして幸運にもC#がそれをやった最初になった。
えーと、LispやOCamlは主要な言語ではなく、C#は主要な言語なんですね。彼の立場では。
まあ、そうなんでしょうけど。
inplicit -> implicitですね。
あと、Ruby版LINQ(?)は、本家LINQに比べると、selectとかsort_byの度に'.'が出現するのがイマイチな気がします。もちろん、意味的には大して変わらないと思いますけど、構文が重要だという立場からは、LINQの意義は否定できないのではないかと思います。もちろん、だからといってRubyにLINQを入れるべきだと言うつもりは無いです。
あ、typoです。直しておきます implicit
構文重要という観点ではforと似たようなものですが、多くの言語に標準的に備わっているforと、どこにもないLINQは同列に並べられませんね。あってまずいとは言わないけど、言語設計者によって判断の別れる領域でしょうね。
娘です。
え〜〜〜っと・・・。
読みました。
えっっっと、がんばって、30日までかいてね。
あ、でも私はLINQよりもRubyの方が読みやすいです。動作がイメージできて。
もっとも、慣れの部分が大きいでしょうね。それに必ずしもクエリーで動作がイメージできる必要はないでしょうし。
Railsなら、
学籍番号前半名s = 学生名簿.find(:all, :conditions=> "学生番号 <= 15", :order => "学生番号").collect{|p| p.名}
ですかね。collectが冗長っぽいですが、必要に応じて簡単にとりだせるのは便利ですし。
ヘルスバーグ氏は明日来日するので、もし質問があればこちらに書いてみると面白いかもしれません。
http://vsug.jp/tabid/63/forumid/45/postid/1423/view/topic/Default.aspx