«前の日記(2007-08-06) 最新 次の日記(2007-08-08)» 編集

Matzにっき


2007-08-07 [長年日記]

_ [Ruby] Lazy Collectionへの第一歩

になるかどうか自信は無いのだが、 1.9でイテレータ系メソッドにブロックを渡さない時に返される Enumerable::Enumeratorクラスに、 外部イテレータとして使うことができるようにnextメソッドを追加した。

実装には最近YARVに追加されたFiberを利用した。 っていうか、Fiberって初めて使ったよ。 使いやすいような、使いにくいような。慣れてないせいかな。

追加したメソッドは以下の通り

  • next - 「次」のオブジェクトを返す。末尾ではStopIteration例外
  • next? - 「次」のオブジェクトがあればtrue
  • rewind - nextでのオブジェクト生成を最初に「巻き戻す」

また、Enumerable#zipメソッドは、以前は引数として渡されたEnumerableを to_aで配列に変換していたが、Enumeratorを外部イテレータとして使うことにした。 これで、無限列もzipの対象にできる。

あと、zipの挙動だが、今まではレシーバの要素数だけ繰返していたが、 今後は正式にレシーバと引数でもっとも少ない要素数だけ繰り返すことにした(今までも1.9ではArray#zipがそうなってた)。

これでgeneratorライブラリを使わなくても簡単に外部イテレータが使えて、 PythonやXtalに一歩近づいた。

_ 蛙男商会からの報告・連絡・相談 祝・開星高校甲子園出場!

開成高校の吉田投手は吉田くんの弟だったんだ(そんなわきゃない)。

それはともかく、誰にでも理解できる表現ができる人には あこがれちゃうなあ。いや、蛙男については必ずしも「誰にでも」とは 言えないかもしれないけど、 少なくともRubyよりは広い範囲に分かってもらえそう。

というわけで、実は蛙男商会も島根県の重要な地域資源(コンテンツ産業)と 見なされているらしいぞ。現在、蛙男さんはほとんど東京に居るみたいだけど。

_ [言語] CSS、YAML、XML、JSONのいいとこ取り? 新データフォーマット「RSD」提案 | マイコミジャーナル

データフォーマットに特化しているという点ではYAML、JSONと同じ方向性のように見える。 CSSの影響が強いので、そっち方面に慣れている人にはわかりやすいかもしれない。

_ 仙石浩明CTO の日記: 面接FAQ: Tech総研「転職体験談」の取材を受けました

採用面接で「どんだけ技術が好きか」という点を集中的に確認するという仙石さん、という話。

技術が好きならば、プログラミング技術は後でいくらでも延ばせるし、 お互いに幸福な関係が築けるだろう、と。 まあ、確かにうちで生き残ってる連中も、 技術好きで日常生活をコンピュータにたとえて下らない話をするのが好きな連中が 多いものな。

今後の採用の参考にしよう。

_ [Ruby] InfoQ: Gemstone OODB to support JRuby, Rubinius

Gemstoneといえば昔一世を風靡したOODBMS。 これがJRubyやRubiniusから使えるようになる、という話。 私はその頃ObjectStoreを使ってたけど。

待て。JavaとのコネクションでなんでもできるJRubyは分かるが Rubiniusが出てて、なんで本家Rubyが対象にならないのか。不思議。

_ [言語] Static Typers vs Dynamic Typers

動的型を好む人(Dynamic Typer)と静的型を好む人(Static Typer)は プログラミングの別の側面を見ているのだろう、という話。

If I understand correctly, people who prefer static type systems tend to

think in terms of structural invariants of their programs, while people who prefer dynamic type systems tend to think in terms of their programs' behavior. I am convinced this is a personal preference, nothing more, nothing less. I guess that static typers have equal problems developing in dynamically typed languages as dynamic typers have developing in statically typed languages. I don't see a problem here: If the requirements are such that a focus on static correctness is important, it's probably better to employ a static typer, whereas if the requirements are such that dynamic flexibility is more important, the job should better be done by a dynamic typer. There is nothing wrong with specialization, we don't need a grand unified theory of program development.

そう言われてみればそんな気もする。

_ asahi.com:ゲゲゲの「ぬりかべ」、こんな姿? 江戸期の絵巻に登場 - 文化・芸能

「ぬりかべ」のあの姿と言うのは伝統的なものだと思っていたのだが、 実は水木さんの創造だったのね。実際はこんな獅子のような姿であったとは。

で、この「L・トム・ペリー コレクション」のL・トム・ペリーってのは、 ペリー長老のことだね、きっと。戦後、進駐軍として日本にいたって聞いてたけど、 ここまで日本通だったとは。

意外。

本日のツッコミ(全11件) [ツッコミを入れる]
_ okuji (2007-08-16 05:11)

素晴らしい! >next<br>rewindは名案ですね。あんまり他では見かけたことがないのですが、まつもとさん自身の発想?

_ まつもと (2007-08-16 08:59)

ありがとうございます。<br><br>rewindは残念ながら私のアイディアではありません。<br>Rubyには以前からgeneratorライブラリという外部イテレータライブラリが添付されているのですが、そのAPIにあったものです。<br>おそらくはgeneratorのメンテナであるknuさんによるアイディアだと思うのですが。

_ 野分 (2007-08-16 13:00)

このnext/next?の定義だと、空集合の繰り返しが上手く処理できませんね。終了判定も面倒ですし。<br><br>nextは末尾ではnil(かあるいは末尾用オブジェクト)を返すようにして、現在の指しているオブジェクトが存在するかどうかを判定するexist?を追加した方が良いと思います。

_ ogijun (2007-08-16 13:30)

RubiniusとはSmalltalkつながりとか? (元記事まだ読んでないですが)

_ ささだ (2007-08-16 14:19)

Enumerator が Iterator の機能をあわせもつのはうれしいのかなぁ。Enumerator#iterator #=> Iterator 、ってやるのは、ちょっと冗長ですか。<br><br>e = 3.times{}; e.each{...}; e.next? #=> true なんて出来るのは気持ち悪い気がします。

_ まつもと (2007-08-16 14:25)

野分さん、<br>上手く処理できない空集合の繰り返しとか面倒な終了判定とかが具体的にイメージできませんでした。むしろ、提案されているexist?の方が面倒に感じるんですが、気のせい?

_ まつもと (2007-08-16 14:28)

iteratorメソッドとかで明示的にイテレータを作るのは冗長過ぎて使われないと思います。<br><br>気持ち悪いと言う指摘はEnumeratorがeachによる「列」とnextによる「列」の両方を持つからでしょうか。それならなんとなく分かるかも。eachがbreakで中断された時のnextが何を返すのかとか。

_ 野分 (2007-08-16 20:00)

もしかしたら勘違いしているかもしれませんが、下記の2つは見分けつきましたっけ?<br>''.to_enum(:each_byte) #=> (1)<br>'a'.to_enum(:each_byte) #=> (2)<br>next?だと両方ともfalseになるかと思います。<br><br>また、exist?のようなメソッドがないと、(1)のようなケースで要素の存在を確認する方法が無いような気がします。

_ まつもと (2007-08-16 23:14)

区別つきます。next?は「次」のnext呼び出しが例外を出すかどうかを判定するので、(1)ではfalse、(2)ではtrueになります。<br><br>「要素の存在を確認する方法」というのはよくわからないのですが、初回(またはrewind実行直後)のnext呼び出しで例外が起きれば(or next?がfalseならば)要素は存在しない、とみなして良いのではないでしょうか。

_ 野分 (2007-08-16 23:36)

む?そうしますと、$を終端とすると<br> | $   ''.to_enum(:each_byte)<br> | a | $ 'a'.to_enum(:each_byte)<br>(1) (2) (3)<br>初回は(1)(何も指していない)状態で、nextで(2)に移行するということでしょうか?<br>#iteratorとして使う場合は初回にnextを呼ばないと<br>#要素にアクセスできない<br><br>これなら問題は発生しなさそうですね。<br>まあ、必ずnextを呼ばなくてはいけないのはムダな気がしますが……

_ まつもと (2007-08-17 09:48)

そういうことです。<br>next以外に要素を取り出す手段がありません(currentとかない)から、無駄ということはないと思います。

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

«前の日記(2007-08-06) 最新 次の日記(2007-08-08)» 編集

track feed Matzにっき Creative Commons License This work is licensed under a Creative Commons License.