[ruby-list:46512] obj.? メソッド

View: New views
4 Messages — Rating Filter:   Alert me  

[ruby-list:46512] obj.? メソッド

by Makoto Kishimoto :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

きしもとです

[ruby-list:46422] から始まるスレッドで一旦却下された話で、
"?" というメソッドは、レシーバを省略した呼び出しで、リテラルや三項演算子と
ぶつかるのでダメ、という話になったわけですが、

レシーバを省略しない呼び出しであれば、現在、obj.def とか obj.end とか obj.and
とか、演算子やそのほかの構文と被ってる名前でも使えるわけですよね?
そういうわけで、obj.? もあっていいんではないか、と改めて提案します。

誰がうれしいか、ということについてですが、パーサコンビネータで、
a a? b という構文規則をたとえば a >> a.opt >> b としていたものを、
a >> a.? >> b と、簡潔かつ直感的にわかりやすく書けるようになります。

リテラルや三項演算子は、def のあとや obj. のあとの文脈で、
def や end や and に比べて、特別でしょうか?


[ruby-list:46513] Re: obj.? メソッド

by 小西 弘将-2 :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

小西弘将です。

反対です。
そもそも、関数に名前をつけないこと自体、プログラマとしてやるべきことでは
ないと考えます。


とだけ書かれて、解るのは自分だけです。いずれ自分も解らなくなります。

> きしもとです
>
> [ruby-list:46422] から始まるスレッドで一旦却下された話で、
> "?" というメソッドは、レシーバを省略した呼び出しで、リテラルや三項演算子と
> ぶつかるのでダメ、という話になったわけですが、
>
> レシーバを省略しない呼び出しであれば、現在、obj.def とか obj.end とか obj.and
> とか、演算子やそのほかの構文と被ってる名前でも使えるわけですよね?
> そういうわけで、obj.? もあっていいんではないか、と改めて提案しまます。
>
> 誰がうれしいか、ということについてですが、パーサコンビネータで、
> a a? b という構文規則をたとえば a >> a.opt >> b としていたものを、
> a >> a.? >> b と、簡潔かつ直感的にわかりやすく書けるようになります。
>
> リテラルや三項演算子は、def のあとや obj. のあとの文脈で、
> def や end や and に比べて、特別でしょうか?
>
>




[ruby-list:46514] Re: obj.? メソッド

by Makoto Kishimoto :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

> 反対です。
> そもそも、関数に名前をつけないこと自体、プログラマとしてやるべきことでは
> ないと考えます。
>
> ?
> とだけ書かれて、解るのは自分だけです。いずれ自分も解らなくなります。

文豪には許されても、プログラマには許されませんかね?

ちなみに obj.! というメソッドは(否定演算子の!の再定義が可能になった副作用? で)
可能になっています。


[ruby-list:46526] Re: obj.? メソッド

by Yusuke ENDOH :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

遠藤です。

2009年11月4日17:00 KISHIMOTO, Makoto <ksmakoto@...>:
> レシーバを省略しない呼び出しであれば、現在、obj.def とか obj.end とか obj.and
> とか、演算子やそのほかの構文と被ってる名前でも使えるわけですよね?
> そういうわけで、obj.? もあっていいんではないか、と改めて提案します。

とくに賛成でも反対でもないのですが


> 誰がうれしいか、ということについてですが、パーサコンビネータで、
> a a? b という構文規則をたとえば a >> a.opt >> b としていたものを、
> a >> a.? >> b と、簡潔かつ直感的にわかりやすく書けるようになります。

DSL で欲しい場合がありそうという需要はなんとなく理解はできました。


もし採用するとしても、こういう文法拡張は 2.0 になるかなと思いつつも、
パッチを書いてみました。既存の文法と衝突するところってありますかね。


  $ ./ruby -e '
  class C
    def ?
      :foo
    end
  end

  p C.new.?  #=> :foo
  '
  :foo


diff --git a/parse.y b/parse.y
index c10dfe6..5490367 100644
--- a/parse.y
+++ b/parse.y
@@ -1793,6 +1793,7 @@ op : '|' { ifndef_ripper($$ = '|'); }
  | '%' { ifndef_ripper($$ = '%'); }
  | tPOW { ifndef_ripper($$ = tPOW); }
  | '!' { ifndef_ripper($$ = '!'); }
+ | '?' { ifndef_ripper($$ = '?'); }
  | '~' { ifndef_ripper($$ = '~'); }
  | tUPLUS { ifndef_ripper($$ = tUPLUS); }
  | tUMINUS { ifndef_ripper($$ = tUMINUS); }
@@ -6675,6 +6676,10 @@ parser_yylex(struct parser_params *parser)
  return tSTRING_BEG;

       case '?':
+ if (lex_state == EXPR_FNAME || lex_state == EXPR_DOT) {
+    lex_state = EXPR_ARG;
+    return '?';
+ }
  if (lex_state == EXPR_END || lex_state == EXPR_ENDARG) {
     lex_state = EXPR_VALUE;
     return '?';

--
Yusuke ENDOH <mame@...>