遅延Enumerableに関連して コメントで教えていただいた 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とかを導入してみればよいのか。
ユーザインタフェースについては気に入らない点が二つ。
前者はコスト的に記憶系を一切持っていないだろうから、しかたないとしても、 後者は手抜き過ぎかな。
This work is licensed under a Creative Commons License.
「面白いけど、ほんとに(言語レベルで)必要?」については<br>アンダース ヘルスバーグへのインタビューが参考になると思います。<br>http://blog.inomata.lolipop.jp/?eid=218193
面白いインタビューですね。LINQについては前半のインタビューにおける<br><br> クエリの文法のほうが読みやすい。構文的には単なる化粧板だと<br> してもね。即座にメソッド呼び出しに置き換えられるのは、<br> foreachループが「whileループでの列挙オブジェクト取得」に置<br> き換えられるようなのと同じだ。でも高レベルで考えるのには便<br> 利だ。<br><br>が、答えなんでしょうね。もっとも、LINQの文法が「高レベルで考えるのに便利」と言いたいならもっとSQLに似せるべきだったと思いますけど(selectの位置とか)。VBではもうちょっと似てるみたいですね。<br><br>あと、以下の部分が面白かったです。<br><br> ああ、まさに。それに、正直、まずは認めるべきときに認めてお<br> くよ。僕は完全に新しい何かを発明したわけじゃない。全てはラ<br> ムダ式とかラムダ計算とか言われるものに基づいているんだ。そ<br> れは関数プログラミングの世界に何十年も前から存在していた。<br> でもなぜか、主流のプログラミング言語においては日の目を見て<br> こなかったんだけど。<br><br> そして幸運にもC#がそれをやった最初になった。<br><br>えーと、LispやOCamlは主要な言語ではなく、C#は主要な言語なんですね。彼の立場では。<br>まあ、そうなんでしょうけど。
inplicit -> implicitですね。<br><br>あと、Ruby版LINQ(?)は、本家LINQに比べると、selectとかsort_byの度に'.'が出現するのがイマイチな気がします。もちろん、意味的には大して変わらないと思いますけど、構文が重要だという立場からは、LINQの意義は否定できないのではないかと思います。もちろん、だからといってRubyにLINQを入れるべきだと言うつもりは無いです。
あ、typoです。直しておきます implicit<br><br>構文重要という観点ではforと似たようなものですが、多くの言語に標準的に備わっているforと、どこにもないLINQは同列に並べられませんね。あってまずいとは言わないけど、言語設計者によって判断の別れる領域でしょうね。
娘です。<br>え〜〜〜っと・・・。<br>読みました。<br>えっっっと、がんばって、30日までかいてね。
あ、でも私はLINQよりもRubyの方が読みやすいです。動作がイメージできて。<br>もっとも、慣れの部分が大きいでしょうね。それに必ずしもクエリーで動作がイメージできる必要はないでしょうし。
Railsなら、<br><br>学籍番号前半名s = 学生名簿.find(:all, :conditions=> "学生番号 <= 15", :order => "学生番号").collect{|p| p.名}<br><br>ですかね。collectが冗長っぽいですが、必要に応じて簡単にとりだせるのは便利ですし。
ヘルスバーグ氏は明日来日するので、もし質問があればこちらに書いてみると面白いかもしれません。<br>http://vsug.jp/tabid/63/forumid/45/postid/1423/view/topic/Default.aspx