今日は父の日だが、母の日に続いてたまたま今日も米子に訪問する責任だった。 統計の数字上は優秀な成績に見える人々が実際には問題に悩んでいるとか、 いろいろ考えさせられることもあった。
なかなかに忙しい日であった。
おおげさな表現だが、気持ちは分かる。
Rubyでは、いつのころからか「1.8.3のような各数字はすべて1桁」というルールに統一している。 1.9からは「2桁目が奇数は開発版」というのは止めてしまった。
現在のルールは
かな。もっとも「2桁目が奇数は開発版」のルールがまだ生きているときに発生した1.9シリーズが、 将来の2.0仕様のテストベッドになってしまったので、実際に上記のルールを適用したことがないのだけど。
昔はひどくて
0.93a, 0.03bのような数字の後ろにアルファベットを付けたもの
マイナーな修正でrepackageしたものに適用していた
0.99.4-961224のような日付を付けたもの
バグ修正などは日付で、文法や大きな仕様の変更はバージョン番号で対応していた
のような全然統一されてなかった。ちょっとは学習しているらしい。
ピッケル本ことProgramming Ruby第二版、日本語訳のチェックを行う。 もう出版が近いというのに、まだまだ修正箇所が多い。
が、おかげで原著の間違いなども見つけており、それだけ質の高いものになる ...のだといいなあ。
7月上旬から中旬が発売予定。二分冊。
表紙はRubyKaigi2006のスライドで見ることができる(10枚目)
ruby-talkでふたたびRubyのUnicode対応、およびM17Nについて話し合われている。
しかし、今回はAustin Zieglerをはじめとして、 私のアイディアに理解を示してくれる英語圏の人が増えたので、 以前よりもずいぶんと楽。
それと、こうしてアイディアを文章にしてみると まだM17Nで具体的に決まってないところがあちこち残っていることが 明らかになる。まあ、前から気づいてたけど。
特にコード変換まわりが鬼門だ。できるだけコード変換をしたくない、 というのが基本的な設計原理だが、とはいえやらなくてすむものでもない。
ずいぶん以前からifやらwhileやらにdoやthenの代わりに":"をつける、 というPython風味の文法をこっそり入れていたのだが、 今日、とうとう外すことにした。
if foo % 2 == 0: puts "even" else puts "odd" end
elseの後ろの括弧は許してなかった。誰も使っていなかったと思うけど。
しかし、Haskellで得られた知見によれば、 「対応する括弧を用いる文法との相互変換を許すなら、インデントによるグループ化は有効」である。
ということは、「コードブロックの先頭が":"であれば、 そのブロックはインデントでグループ化する」という文法を導入するのは ありえる選択肢かもしれない。
if foo % 2 == 0: puts "odd" else: puts [1,2,3].each do: |x| puts x
なんとPython風味。 レイアウトを使うパーサーを書くのが面倒なので、 単なるアイディアだけ。
これもエイプリルフールねたレベルだなあ。
Katahdinは言語の文法や意味が実行時に変更可能な言語。 文法や意味が揺らがないことを目指したRubyとはある意味対極の言語である。
作者がイギリス陸軍に入隊するため開発が継続できないという事情も珍しい。 「パブリックドメインだから好きにして」とのこと。 Mono上で動作する。
ちょっと読解に自信がないのだが、 プロトコルに継続を含めることにより状態のないサーバで トランザクション/セッションを実現するプロトコル。
が、リクエスト/レスポンスに継続を含めると 継続の書き換えが問題にならないかな。 適当に暗号化すれば問題は回避できるかな。
Google-perftoolsなんてのがあるって知らなかった。
プログラムを書き換えることで一部分だけプロファイリングできるのは 便利かもしれない。
ひさしぶりのポスト。
なんだか1.9.2のリリースが現実的になってきて、 長い長いRuby2.0のためのモラトリアム期間も終了の気配。 そろそろ真面目に2.0について考えねばならないかも。
いや、考えてきてたのだよ、実際。そこで少しずつリークしておくことにしよう。 私が、万が一にもトラックにはねられた時のためにも。
注意。このエントリはRuby 2.0に入るかもしれない機能について述べていますが、本機能が本当に2.0に採用されるかどうかは、未定です。
Rubyのブロックは「暗黙の引数」なので、通常の引数リストに入らない。 ので、あるメソッドが受けとった引数を他のメソッドにすべて引き渡す時、
def bar(*args) foo(*args) end
とやってもブロックが渡らなくて悲しい、ということになる。正確には
def bar(*args, &blk) foo(*args, &blk) end
としなければならない。が、考えてみると「引数を全部渡したい」というひとつのコンセプトを実現するために、複数の「もの」を渡さねばならないのはめんどくさい。
もっとも、いちばんひんぱんに発生しそうなスーパークラスのメソッドの呼び出しについては、
super
と呼べば、全部渡ることになっているので、問題は少ないのだが。
というわけで、「メソッド引数を全部渡す」文法を追加することを漠然と考えている。
文法はこんな感じ。
def bar(*args) foo(...) end
つまり「...」のみが引数に登場した時には、それは「渡された引数を(ブロックも含めて)全部転送」という意味に解釈しようということだ。あるいは、
def bar(*args) foo(:bar, ...) end
のように、先頭に引数を追加することができてもよいかもしれないが、 たぶん、それはやりすぎだろう。
それから、今までのsuperは
super(...)
の省略形であると解釈する。
実装は、現状のsuperの引数渡しの部分をそのまま流用すればよいはずだから、そんなに難しくないはず。