[#11952] NORETURN — "Nobuyoshi.Nakada" <nobu.nakada@...>

なかだです。

24 messages 2001/01/10
[#11956] Re: NORETURN — WATANABE Hirofumi <eban@...> 2001/01/10

わたなべです.

[#11957] Re: NORETURN — matz@... (Yukihiro Matsumoto) 2001/01/10

まつもと ゆきひろです

[#11958] Re: NORETURN — WATANABE Hirofumi <eban@...> 2001/01/10

わたなべです.

[#11959] CVS branches (Re: Re: NORETURN) — matz@... (Yukihiro Matsumoto) 2001/01/10

[#12087] string#index, gsub, []= のバグ? — Beyond <beyond@...>

18 messages 2001/01/27
[#12091] Re: string#index, gsub, []= のバグ? — matz@... (Yukihiro Matsumoto) 2001/01/27

まつもと ゆきひろです

[ruby-dev:12054] break from proc-closure (Re: [ruby-list:27277])

From: Masatoshi SEKI <m_seki@...>
Date: 2001-01-21 18:16:49 UTC
List: ruby-dev #12054
咳といいます。

助けて下さい。[ruby-list:27268] 付近から引越しです。

> In message "[ruby-list:27267] Re: break from proc-closure"
>     on 01/01/21, Masatoshi SEKI <m_seki@mva.biglobe.ne.jp> writes:
> 
> |> Proc中でのbreakはyield(=Proc#call)の即時終了を意味し、異常系
> |> ではないので例外は発生しません。ってのは助けにならないでしょ
> |> うねえ。どうしましょう?
> |
> |1.4系だと #<LocalJumpError: break from proc-closure> だったと
> |思います。
> 
> なんか1.5の途中で仕様変更したような気がします。
> どのような仕様が望ましいかについては話に乗ります。
> ruby-devに移動しましょう。

Procでのbreak, retryについてです。

ブロック付きメソッドのブロック側の 
  * break は、ブロック付きメソッドの終了
  * retry は、ブロック付きメソッドをやり直し
  * next は、ブロックの終了
  * redo は、ブロックのやり直し
を示しています。

dRubyでは Proc を呼んだ結果から評価した値とbreak/retryがあったことを
取り出してブロック付きメソッドをプロセス間で再現しています。

→ [ruby-list:21431]

当時のまつもとさんに確認したことは、
咳:
| イテレータでないとき、Proc 内で next, redo, break, retry が
| 起きたときの挙動について教えて下さい。
| 1.4.3で実験したのですが、次のようになります。
|
|  next	Procが終了する
|  redo	Procのはじめからもう一度実行される
|  break	LocalJumpError "break from proc-closure" 例外
|  retry	LocalJumpError "retry from proc-closure" 例外
| 
| この動作は仕様というか、あてにしても良いでしょうか?
matz:
> 「イテレータでないとき」とはProcオブジェクトがその生成された
> コンテキストを越えて使われたとき、と解釈します。つまり、ブロッ
>クを与えたメソッドの内部で使われた場合を除くわけです。
>
> その場合、この挙動は仕様です。

なぬ!? コンテキストを越えるかどうかが問題なのか!!

すると今まで出した例は不適切かもしれません。
dRubyではコンテキストを越えてます。

再び実験してみました。

--- foo.rb
def make_proc          # コンテキストを越えさせるためにメソッドにしました
  Proc.new do |n|
    puts n
    break if n == 3
  end
end

proc = make_proc

begin
  (1..5).each(&proc)
  puts 'done'
rescue LocalJumpError
  p $!
end

begin
  proc.call(3)
rescue LocalJumpError
  p $!
end
--- 1.6.2
ruby 1.6.2 (2000-12-25) [i586-linux]
1
2
3
#<LocalJumpError: break from proc-closure>
3
--- 1.4.6
ruby 1.4.6 (2000-08-16) [i586-linux]
1
2
3
#<LocalJumpError: break from proc-closure>
3
#<LocalJumpError: break from proc-closure>
---


むむー。
proc.call のときは例外が発生しないけど、each(&proc) のときは
例外が発生します。

これは意図した挙動でしょうか? 

どちらも LocalJumpError にして欲しいよう。

In This Thread

Prev Next