From: Nobuyoshi Nakada Date: 2008-02-03T21:33:15+09:00 Subject: [ruby-dev:33576] Re: rational, complex and nuby なかだです。 At Sun, 3 Feb 2008 17:33:54 +0900, Tadayoshi Funaba wrote in [ruby-dev:33575]: > それはどうですかね。Numeric#floor の実装は、ぜんぜん一般的な解決になっ > てないんですよ。rational では、別途実装すべきです。ruby では、抽象クラ > スで、プロトコルなりインターフェイスを示すということもないので、Float > でしか意味のないものを Numeric に置いておく必要はないと思います。 > > floor だけじゃないですよ。truncate、ceil、round も同じです。 Float固有のものはすべてNumericではなくFloatに、ということですか。 それは納得です。 > > RationalやComplexの組込みは、リテラルも含めてまぁいいんじゃない > > かと思うのですが、mathnはどうでしょうねぇ。少なくとも、//演算子 > > にはいささか抵抗を感じます。たとえば string.split // などという > > ものがsyntax errorになってしまうこととか。 > > まあ、簡単に ruby に採用されないようだがら、こういうものを作ってみたわ > けですけど、実際には、たいした影響はないように感じています。// 自体は、 > Smalltalk や Python にもあるので、新奇なものでもないですし。 Pythonだと//はintじゃなくてfloatを返すようですね。 あと、//=が未対応のようです。 > 文法上の課題としては、括弧のあつかいのほうがデカいので、むしろ、引数の > 括弧省略を止めてもいいと思います。 括弧省略自体は止めるわけにはいかないと思いますが、もう少し整理で きるのではないかと思います。 --- parse.y~ 2008-02-02 13:47:15.000000000 +0900 +++ parse.y 2008-02-03 17:57:07.000000000 +0900 @@ -4259,21 +4259,22 @@ yylex() return tOP_ASGN; } + if (c == '/') { + if ((c = nextc()) == '=') { + yylval.id = tIDIV; + lex_state = EXPR_BEG; + return tOP_ASGN; + } + else { + pushback(c); + return tIDIV; + } + } pushback(c); - { - int c2; - - if ((c2 = nextc()) != '/') { - - pushback(c2); - if (IS_ARG() && space_seen) { - if (!ISSPACE(c)) { + if (IS_ARG() && space_seen) { + if (!ISSPACE(c)) { arg_ambiguous(); lex_strterm = NEW_STRTERM(str_regexp, '/', 0); return tREGEXP_BEG; - } } - } else { - pushback(c2); - } } switch (lex_state) { @@ -4283,8 +4284,4 @@ yylex() lex_state = EXPR_BEG; break; } - if ((c = nextc()) == '/') { - return tIDIV; - } - pushback(c); return '/'; -- --- 僕の前にBugはない。 --- 僕の後ろにBugはできる。 中田 伸悦