«前の日記(2006-01-27) 最新 次の日記(2006-01-29)» 編集

Matzにっき

迷惑メール対策なら Dr.WEB
『Dr.WEB メールデーモン』、MTA 用迷惑メール対策製品です!


2006-01-28 [長年日記]

_ [言語] LINQ

遅延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とかを導入してみればよいのか。

ユーザインタフェースについては気に入らない点が二つ。

  • 電源が落ちるとリセットされる
  • 「戻る」ボタンを押すと、前の曲の先頭に戻る。

前者はコスト的に記憶系を一切持っていないだろうから、しかたないとしても、 後者は手抜き過ぎかな。

本日のツッコミ(全8件) [ツッコミを入れる]
_ kamiya (2006-01-30 10:56)

「面白いけど、ほんとに(言語レベルで)必要?」については<br>アンダース ヘルスバーグへのインタビューが参考になると思います。<br>http://blog.inomata.lolipop.jp/?eid=218193

_ まつもと (2006-01-30 11:44)

面白いインタビューですね。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>まあ、そうなんでしょうけど。

_ みずしま (2006-01-30 12:22)

inplicit -> implicitですね。<br><br>あと、Ruby版LINQ(?)は、本家LINQに比べると、selectとかsort_byの度に'.'が出現するのがイマイチな気がします。もちろん、意味的には大して変わらないと思いますけど、構文が重要だという立場からは、LINQの意義は否定できないのではないかと思います。もちろん、だからといってRubyにLINQを入れるべきだと言うつもりは無いです。

_ まつもと (2006-01-30 14:50)

あ、typoです。直しておきます implicit<br><br>構文重要という観点ではforと似たようなものですが、多くの言語に標準的に備わっているforと、どこにもないLINQは同列に並べられませんね。あってまずいとは言わないけど、言語設計者によって判断の別れる領域でしょうね。

_ Matz Jr. (2006-01-30 14:51)

娘です。<br>え〜〜〜っと・・・。<br>読みました。<br>えっっっと、がんばって、30日までかいてね。

_ まつもと (2006-01-30 15:10)

あ、でも私はLINQよりもRubyの方が読みやすいです。動作がイメージできて。<br>もっとも、慣れの部分が大きいでしょうね。それに必ずしもクエリーで動作がイメージできる必要はないでしょうし。

_ たかはし (2006-01-31 12:37)

Railsなら、<br><br>学籍番号前半名s = 学生名簿.find(:all, :conditions=> "学生番号 <= 15", :order => "学生番号").collect{|p| p.名}<br><br>ですかね。collectが冗長っぽいですが、必要に応じて簡単にとりだせるのは便利ですし。

_ kamiya (2006-01-31 17:31)

ヘルスバーグ氏は明日来日するので、もし質問があればこちらに書いてみると面白いかもしれません。<br>http://vsug.jp/tabid/63/forumid/45/postid/1423/view/topic/Default.aspx

お名前:
E-mail:
コメント:
[]

«前の日記(2006-01-27) 最新 次の日記(2006-01-29)» 編集

RSS feed meter for http://www.rubyist.net/~matz/ track feed Matzにっき Creative Commons License This work is licensed under a Creative Commons License.