トップ «前の日記(2009-08-07) 最新 次の日記(2009-08-11)» 編集

Route 477



2009-08-10

[ruby] 複素数リテラルはどうなった

Ruby 1.9では、「require 'complex'」なしにComplexクラスが使えるようになっていることにお気づきでしょうか。これに伴い(?)、 7/22-7/24頃にruby-devで、Ruby 1.9.2に複素数リテラルを導入するかどうかの議論がありました。 (bladeが止まっててリンクが張れない…。)

議論があっただけで、まだ何も変更は入ってないようなので、 複素数リテラルが欲しい人は1.9.2の仕様がfreezeされる前にruby-devとかruby-listに催促メールしましょう。1.9.2の仕様はあなたが作る!

虚数リテラル案

2i
2.0i
  • 1+2iは 1 + 2i (Interger#+の呼び出し)なので、「複素数リテラル」ではなく「虚数リテラル」が正確
  • 1.9.2には有理数リテラルがないので、1/3iは1/(3i)になってしまう
  • 1+2iはいいけど、2をnに変えたいと思ったとき、1+niとは書けないのでComplex(1, n)に直さなければならない

虚数化文法案

1+(2)i
1+(n)i
  • 文法をいじるので実装がでかい

それComplex::Iでできるよ案

1 + n * Complex::I
あるいは、include Complexして
1 + n * I
  • 既に実装されている

Numeric#i案

1 + 2.i
1 + n.i
  • すっきりしてて良さそう?

User-defined literals案

2i #=> 2.literal_i
  • C++0xではできるらしい。さすがC++さん
  • ユーザが好きにリテラル定義しまくるとカオスになるのでは

感想

Numeric#iを入れて、虚数リテラルは入れない、でいいんじゃないかなぁと思いました。 メソッドの導入で済むなら文法は増やさない方が、parse.y的にも学習コスト的にもリファレンス的にも良いんじゃないかなと。

[sinatra][javascript] SinatraがJavaScriptにも移植されたようです(Sammy)

いろんな言語に波及しているRuby用のWebフレームワーク、Sinatraですが、 今度はJavaScriptでの実装が現れた模様。

といっても、サーバサイドJSではありません。サンプルコード。

 get('#/', function() { with(this) {
   $element().text('Click form!');
 }});

aタグのリンク先を "#/foo/bar" のように「pathっぽいアンカー」にすることで、Sinatra風のイベント定義を実現しているようです。

GUIのボタンにpathを振るというアイデアはRuby Shoesがやっていましたが、 これをWebアプリに逆輸入した形になりますね。