Deprecated: The each() function is deprecated. This message will be suppressed on further calls in /home/zhenxiangba/zhenxiangba.com/public_html/phproxy-improved-master/index.php on line 456
Matzにっき(2006-01-28)
[go: Go Back, main page]

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

Matzにっき

<< 2006/01/ 1 1. 元旦
2 1. 出産
2. 帰省
3. 到着
3 1. デジタル体重計のユーザインタフェース
4 1. Classbox
2. Classboxの実装
5 1. 帰宅
2. PCレスライフ
6 1. PC修理
7 1. 雪かき
2. プログラミング言語SRU
8 1. 断食安息日
2. あーめん
3. 筋肉痛・体調不良
9 1. 米子
10 1. オープンソースマガジン3月号
11 1. 日経Linux 3月号
12 1. Charming Ruby Compiler
2. The Open Nature Of Ruby
13 1. ニート娘に悩む親
2. Python Status Update
3. 泥縄
14 1. 宣教師のお手伝い
2. Simplified/Traditional
3. ボーリング
15 1. 代打不発
2. セミナリー補習
16 1. 不達
2. 誕生日
17 1. 萌え指向プログラミング言語「萌香」
2. Classbox/R
18 1. CommonLispのpackage
19 1. これは便利! と思える elisp プログラムを教えてください
20 1. 「オブジェクト指向神話」神話
21 1. 片付けの日
2. 食べ放題は危険
22 1. 松江
2. お客さま
23 24 1. ruby_block撲滅運動
2. 『よくわかる現代魔法
25 1. 遅延Enumerable
26 1. Thinkpad復活
2. Rastに挑戦?
3. オープンソースの全文検索エンジンの速度性能比較」のご紹介
27 1. 「Javaの生みの親」に聞く「AJAX、LAMP、Ruby on Rails」
2. 「オブジェクト指向」改め「抽象データ指向」
28 1. LINQ
2. シガーソングライター(もどき)
29 1. 慈愛
2. 天国
30 31 1. サブジェクト指向
>>
Dr.Web 予測するアンチウイルス  Hiki も使った新サイト、10/18 リニューアルオープン!

2006-01-28 [長年日記]

_ [言語] LINQ

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

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

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

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

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

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

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

面白いインタビューですね。LINQについては前半のインタビューにおける

  クエリの文法のほうが読みやすい。構文的には単なる化粧板だと
  してもね。即座にメソッド呼び出しに置き換えられるのは、
  foreachループが「whileループでの列挙オブジェクト取得」に置
  き換えられるようなのと同じだ。でも高レベルで考えるのには便
  利だ。

が、答えなんでしょうね。もっとも、LINQの文法が「高レベルで考えるのに便利」と言いたいならもっとSQLに似せるべきだったと思いますけど(selectの位置とか)。VBではもうちょっと似てるみたいですね。

あと、以下の部分が面白かったです。

  ああ、まさに。それに、正直、まずは認めるべきときに認めてお
  くよ。僕は完全に新しい何かを発明したわけじゃない。全てはラ
  ムダ式とかラムダ計算とか言われるものに基づいているんだ。そ
  れは関数プログラミングの世界に何十年も前から存在していた。
  でもなぜか、主流のプログラミング言語においては日の目を見て
  こなかったんだけど。

  そして幸運にもC#がそれをやった最初になった。

えーと、LispやOCamlは主要な言語ではなく、C#は主要な言語なんですね。彼の立場では。
まあ、そうなんでしょうけど。

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

inplicit -> implicitですね。

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

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

あ、typoです。直しておきます implicit

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

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

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

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

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

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

Railsなら、

学籍番号前半名s = 学生名簿.find(:all, :conditions=> "学生番号 <= 15", :order => "学生番号").collect{|p| p.名}

ですかね。collectが冗長っぽいですが、必要に応じて簡単にとりだせるのは便利ですし。

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

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

お名前:
E-mail:
コメント:
本日のリンク元
アンテナ
検索

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