複素数のためにリテラルを考えてみた

ruby-dev や ruby-list で上が (っては消え) る話に、複素数リテラルがあります。要は

Complex(1, 2)

1+2i

などと書きたいという話。僕自身は複素数なんて (Project Euler くらいでしか) 使ったことがないんで、リテラルが必要とは感じないんですが、こういう仕様を考えてみました。

1+2i

1+2.sugar_i

の syntax sugar とする。i に限定せず、数字リテラルに続くの英字を sugar_<それ> というメソッドの呼び出しとみなします。あとは Numeric#sugar_i を実装すれば OK 。


さらに引数として数値リテラルを書けるようにすれば、虚数なんて使わねーよという人にも使い道があります。例えば

5C3  =>  5.sugar_C(3)  #=> 20
5P3  =>  5.sugar_P(3)  #=> 60

とすれば順列や組み合わせの数を数学っぽく書けます。より Project Euler 向けの言語になりました。
また、元からあるリテラル

0x100  =>  0.sugar_x(100)  #=> 256
1E-1   =>  1.sugar_E(-1)   #=> 0.1

となるので、メソッドとして実現できることになります。クールです。0x-1 とか 1E0.5 とかどうなるのかわかりませんけどクールです。
Perl が大好きな人は

2x3  =>  2.sugar_x(3)  #=> "222"

とかするとオシャレです。16 進数リテラルとかぶってるのは突っ込んだら負けです。
根っからのアセンブラな人は

100H  =>  100.sugar_H  #=> 256

とすると心が安らぐことでしょう。255 が書けないのは愛嬌です。
あとは

(0w0)  =>  0.sugar_w(0)  #=> "オンドゥル"

とか。ちょっと懐かしい。


以上、数値リテラルの拡張の提案でした。ほとんど冗談だけど、うまく設計すれば便利、かも。でも Perl 化しすぎなのでやっぱりダメかな。