[#25808] break & retry in block — Shin-ichiro HARA <sinara@...>

原です。

15 messages 2005/03/04

[#25812] Re: [ruby-cvs] ruby/test/ruby, ruby/test/logger, ruby/sample, ruby/misc, ruby/lib/xmlrpc, ruby/lib/wsdl/soap, ruby/lib/rexml, ruby/lib/rdoc/parsers, ruby/lib/rdoc/generators, ruby/lib/irb, ruby/lib, ruby/ext/zlib, ruby/ext/win32ole, ruby/ext/tk, ruby/ext/strscan, ruby/ext/socket, ruby/ext/readline, ruby/ext/pty, ruby/ext/openssl, ruby/ext/iconv, ruby/ext/etc, ruby/ext/dl, ruby/ext/curses, ruby/ext/bigdecimal, ruby/ext/Win32API, ruby: * array.c: replace rb_protect_inspect() and rb_inspecting_p() by — Tanaka Akira <akr@...17n.org>

In article <20050304064753.53859C671F@lithium.ruby-lang.org>,

3 messages 2005/03/06

[#25853] conflict method and local variable — Hidetoshi NAGAI <nagai@...>

永井@知能.九工大です.

56 messages 2005/03/10
[#25854] Re: conflict method and local variable — Yukihiro Matsumoto <matz@...> 2005/03/10

まつもと ゆきひろです

[#25855] Re: conflict method and local variable — Hidetoshi NAGAI <nagai@...> 2005/03/10

永井@知能.九工大です.

[#25856] Re: conflict method and local variable — Yukihiro Matsumoto <matz@...> 2005/03/10

まつもと ゆきひろです

[#25857] Re: conflict method and local variable — Hidetoshi NAGAI <nagai@...> 2005/03/11

永井@知能.九工大です.

[#25858] Re: conflict method and local variable — Yukihiro Matsumoto <matz@...> 2005/03/11

まつもと ゆきひろです

[#25861] Re: conflict method and local variable — Hidetoshi NAGAI <nagai@...> 2005/03/11

永井@知能.九工大です.

[#25863] Re: conflict method and local variable — Yukihiro Matsumoto <matz@...> 2005/03/11

まつもと ゆきひろです

[#25864] Re: conflict method and local variable — Hidetoshi NAGAI <nagai@...> 2005/03/11

永井@知能.九工大です.

[#25865] Re: conflict method and local variable — Yukihiro Matsumoto <matz@...> 2005/03/11

まつもと ゆきひろです

[#25866] Re: conflict method and local variable — Hidetoshi NAGAI <nagai@...> 2005/03/11

永井@知能.九工大です.

[#25869] Re: conflict method and local variable — Shugo Maeda <shugo@...> 2005/03/13

前田です。

[#25875] Re: conflict method and local variable — Yukihiro Matsumoto <matz@...> 2005/03/13

まつもと ゆきひろです

[#25878] Re: conflict method and local variable — Hidetoshi NAGAI <nagai@...> 2005/03/13

永井@知能.九工大です.

[#25882] Re: conflict method and local variable — Yukihiro Matsumoto <matz@...> 2005/03/13

まつもと ゆきひろです

[#25884] Re: conflict method and local variable — Hidetoshi NAGAI <nagai@...> 2005/03/14

永井@知能.九工大です.

[#25885] Re: conflict method and local variable — Yukihiro Matsumoto <matz@...> 2005/03/14

まつもと ゆきひろです

[#25888] Re: conflict method and local variable — Shugo Maeda <shugo@...> 2005/03/14

前田です。

[#25946] ext/tk/sample/**/*.gif are broken — "H.Yamamoto" <ocean@...2.ccsnet.ne.jp>

山本です。

16 messages 2005/03/27

[#25959] some trouble on ext/tk/sample — "H.Yamamoto" <ocean@...2.ccsnet.ne.jp>

山本です。

20 messages 2005/03/29
[#25969] Re: some trouble on ext/tk/sample — Hidetoshi NAGAI <nagai@...> 2005/03/30

永井@知能.九工大です.

[#25970] Re: some trouble on ext/tk/sample — "H.Yamamoto" <ocean@...2.ccsnet.ne.jp> 2005/03/30

山本です。

[#25973] Re: some trouble on ext/tk/sample — Hidetoshi NAGAI <nagai@...> 2005/03/31

永井@知能.九工大です.

[ruby-dev:25830] Re: break & retry in block

From: Shin-ichiro HARA <sinara@...>
Date: 2005-03-08 03:04:47 UTC
List: ruby-dev #25830
原です。

XがAならYもAだという言い方は分かり辛いですねすいません。

>まつもと ゆきひろです
>
>In message "Re: [ruby-dev:25822] Re: break & retry in block"
>    on Mon, 7 Mar 2005 14:52:04 +0900, Yukihiro Matsumoto 
><matz@ruby-lang.org> writes:
>
>|1.9では(3)がエラーになっていますが、
>|これはバグだと思います。
>
>バグじゃありませんでした。1.9ではprocはcallがyieldと同じ働き
>をする(だからbreakは上にpropagateする)ようにしたのでした。し
>かし、作者も引っかかるということは、あんまり良くない仕様なの
>かなあ。

(1)と(2)関連では、f(&proc{break(0)}) は f{break(0)} と同じに
したらどうでしょう。つまり、break、retryはprocに対してではな
く、それを伴った(&で渡された)メソッドに対するものだと考える
わけです。たとえば

def f
  yield
end
def g
  b = proc{ retry }
  f(&b)
end
g

で、retryされるのはprocでもなくgでもなくfとしたらどうでしょ
うか。

これはprocをメソッドとして特別扱いしているように見えるけど、
実はそうではなくて、今までは

(A)  break(retry)はそのブロックを伴うメソッドをブレーク
  (リトライ)させる

と思っていたんだけれど、実は

(B)  break(retry)はそのブロックをyield(call)するメソッ
  ドをブレーク(リトライ)させる

のだったのだと解釈しなおせば大きな仕様の変更ではないのでは
ないでしょうか。proc内部ではyieldは無いので、後者の原理に
よれば、procをブレーク(リトライ)させないのは当然になりま
す。

中田さんのproc{}を{}と書けるようにしてしまう提案にも沿うよ
うな気もするし。


(3)と(4)関連では、先の(B)に従えば、

def f
  proc{break(0)}.call
  1
end
f

はfが0という値で返る、ということになるのですが、まつもと
さんの1.9での意図もこの考えと同じなのかな?

だとすると、retryも「上」のメソッドをリトライさせた方が統
一感があるような気がします。つまり

def f
  proc{retry}.call
end
g

では、リトライはprocの上のfから始まるべきではないかかと。

だからトップレベルでのproc{break(0)}.callやproc{retry}.call
はエラーということになる。

質問じゃなくて提案になってしまったけど、いかがでしょう。


In This Thread