Return from proc

e$B!!$5$5$@$G$9!%e(B

e$B!!e(Bproc{return} e$B$C$F!$$=$N%a%=%C%I$+$ie(B return
e$B$9$k!$$GNI$$$N$G$9$h$M!)e(B

$ …/build_1_8/ruby -ve ’

m()

ruby 1.8.7 (2008-06-18 patchlevel 5000) [i686-linux]
:ng

e$B!!e(B1.8.7 e$B$G$O!$e(Bproc e$B$+$ie(B return
e$B$7$F$$$k5$$,$7$^$9!%e(B

At Thu, 19 Jun 2008 09:37:03 +0900,
SASADA Koichi wrote:

 proc{return} って,そのメソッドから return する,で良いのですよね?
(snip)
 1.8.7 では,proc から return している気がします.

1.9 での変更点ですよね。1.8.6 -> 1.8.7 で変わったわけではないです。

% ruby <<EOF
def m
open(’/etc/hosts’) { return }
p :not_reached
end
m
EOF

は 1.8 以前でも m から return しますが。

1.9 では break で値を返せるようになったし、一貫性を取るに迷いなしと。

e$B!!$5$5$@$G$9!%e(B

Akinori MUSHA wrote:

1.9 e$B$G$NJQ99E@$G$9$h$M!#e(B1.8.6 -> 1.8.7 e$B$GJQ$o$C$?$o$1$G$O$J$$$G$9!#e(B

e$B!!$$$(!$e(Bproce$B$,%M%9%H$7$F$$$k;~$K!$JQ$@$J!$$H$$$&OC$G$9!%e(B1.8
e$B0JA0$NLde(B
e$BBj$G$9!%e(B1.8 e$B$^$G$O!$e(Bproc
e$B$N07$$$OHyL/$J$N$G!$$"$^$j5$$K$7$J$$$G$b$$e(B
e$B$$$N$+$b$7$l$^$;$s!%e(B

e$B$^$D$b$He(B e$B$f$-$R$m$G$9e(B

In message “Re: [ruby-dev:35170] Re: return from proc”
on Thu, 19 Jun 2008 12:05:31 +0900, SASADA Koichi [email protected]
writes:

|Akinori MUSHA wrote:
|> 1.9 e$B$G$NJQ99E@$G$9$h$M!#e(B1.8.6 → 1.8.7 e$B$GJQ$o$C$?$o$1$G$O$J$$$G$9!#e(B
|
|e$B!!$$$(!$e(Bproce$B$,%M%9%H$7$F$$$k;~$K!$JQ$@$J!$$H$$$&OC$G$9!%e(B1.8 e$B0JA0$NLde(B
|e$BBj$G$9!%e(B1.8 e$B$^$G$O!$e(Bproc e$B$N07$$$OHyL/$J$N$G!$$"$^$j5$$K$7$J$$$G$b$$e(B
|e$B$$$N$+$b$7$l$^$;$s!%e(B

e$B$=$&$G$9!#e(B1.8e$B$N;~$O0O$s$G$$$k%a%=%C%I$+$iC&=P$9$k$O$:$G$9!#e(B
e$B$G!"0O$s$G$$$k%a%=%C%I$+$iH4$1$A$c$C$?;~$K$Oe(Blocal jump error
e$B$K$J$k$O$:!#e(B

e$B$C$F$3$H$O>e5-$NLdBj$Oe(B1.8e$B$N%P%0$G$9$M!#$"$H$GD>$7$^$9!#e(B

At Thu, 19 Jun 2008 12:12:50 +0900,
matz wrote:

そうです。1.8の時は囲んでいるメソッドから脱出するはずです。
で、囲んでいるメソッドから抜けちゃった時にはlocal jump error
になるはず。

ってことは上記の問題は1.8のバグですね。あとで直します。

互換性の問題があるのでちょっと慎重に考えたいです。

直しやすければ 1.8.8 から変えるのもありですが、 proc {} 内で
return しているところを検出するのはツールの助けが必要ですよね。
(文字列のevalはさておき)

1.8で動くRipperがあればいいんだろうか。しかし、1.9のパーザでは
文法エラーという1.8用コードも存在するのがちょっと痛い…。

そういえば、1.8でも break は値を返せました。勘違い。