[ruby-dev:40453] [Bug #2776] can't return from lambda with outer block

Previous Topic Next Topic
 
classic Classic list List threaded Threaded
6 messages Options
Reply | Threaded
Open this post in threaded view
|

[ruby-dev:40453] [Bug #2776] can't return from lambda with outer block

Dennis Ranke-2
Bug #2776: can't return from lambda with outer block
http://redmine.ruby-lang.org/issues/show/2776

起票者: _ wanabe
ステータス: Open, 優先度: Low
担当者: Koichi Sasada, カテゴリ: core, Target version: 1.9.x
ruby -v: ruby 1.9.2dev (2010-02-21 trunk 26722) [i686-linux]

http://pc12.2ch.net/test/read.cgi/tech/1264635554/685 で質問されていたのですが
1.8 と 1.9 で lambda の挙動が異なっています。

----------------------------------------
# test.rb
class Foo
  def initialize(&func)
    @func = lambda(&func)
  end
  def bar(x)
    @func.call(x)
  end
end
foo = Foo.new{ |x| return x**2 }
p foo.bar(2)
----------------------------------------

$ ruby1.8 -v test.rb
ruby 1.8.7 (2009-06-12 patchlevel 174) [i486-linux]
4

$ ./ruby -v test.rb
ruby 1.9.2dev (2010-02-21 trunk 26722) [i686-linux]
test.rb:9:in `block in <main>': unexpected return (LocalJumpError)
        from test.rb:6:in `call'
        from test.rb:6:in `bar'
        from test.rb:10:in `<main>'


----------------------------------------
http://redmine.ruby-lang.org

Reply | Threaded
Open this post in threaded view
|

[ruby-dev:40454] [Bug #2776] can't return from lambda with outer block

Dennis Ranke-2
チケット #2776 が更新されました。 (by Shyouhei Urabe)

担当者 Koichi SasadaからYukihiro Matsumotoに変更

異なっているのは事実ですが、どちらが正しいか(あるいは両方間違い)は議論の余地がありそうです。

# lambda(&proc) でprocをlambdaに変換できるかどうかの違い?
----------------------------------------
http://redmine.ruby-lang.org/issues/show/2776

----------------------------------------
http://redmine.ruby-lang.org

Reply | Threaded
Open this post in threaded view
|

[ruby-dev:40455] Re: [Bug #2776] can't return from lambda with outer block

Nobuyoshi Nakada-2
なかだです。

At Mon, 22 Feb 2010 13:13:47 +0900,
Shyouhei Urabe wrote in [ruby-dev:40454]:
> 異なっているのは事実ですが、どちらが正しいか(あるいは両方間違い)は議論の余地がありそうです。
>
> # lambda(&proc) でprocをlambdaに変換できるかどうかの違い?

そういうことですね。1.9を1.8に合わせるならこんな感じ。


Index: proc.c
===================================================================
--- proc.c (revision 26728)
+++ proc.c (working copy)
@@ -401,12 +401,15 @@ proc_new(VALUE klass, int is_lambda)
 
     if (procval) {
+ rb_proc_t *proc;
  if (RBASIC(procval)->klass == klass) {
-    return procval;
- }
- else {
-    VALUE newprocval = proc_dup(procval);
-    RBASIC(newprocval)->klass = klass;
-    return newprocval;
+    GetProcPtr(procval, proc);
+    if ((proc->is_lambda != 0) == (is_lambda != 0))
+ return procval;
  }
+ procval = proc_dup(procval);
+ RBASIC(procval)->klass = klass;
+ GetProcPtr(procval, proc);
+ proc->is_lambda = is_lambda ? TRUE : FALSE;
+ return procval;
     }
 


--
--- 僕の前にBugはない。
--- 僕の後ろにBugはできる。
    中田 伸悦

Reply | Threaded
Open this post in threaded view
|

[ruby-dev:40456] Re: [Bug #2776] can't return from lambda with outer block

Tanaka Akira-3
2010年2月22日14:37 Nobuyoshi Nakada <[hidden email]>:

>> # lambda(&proc) でprocをlambdaに変換できるかどうかの違い?
>
> そういうことですね。1.9を1.8に合わせるならこんな感じ。

Proc#lambda? のドキュメントに書いてありますが、
1.9 では、Proc オブジェクトが lambda かどうかという性質は
なるべく変えないというデザインになっています。
--
[田中 哲][たなか あきら][Tanaka Akira]

Reply | Threaded
Open this post in threaded view
|

[ruby-dev:40459] Re: [Bug #2776] can't return from lambda with outer block

Nobuyoshi Nakada-2
なかだです。

At Mon, 22 Feb 2010 15:00:34 +0900,
Tanaka Akira wrote in [ruby-dev:40456]:
> Proc#lambda? のドキュメントに書いてありますが、
> 1.9 では、Proc オブジェクトが lambda かどうかという性質は
> なるべく変えないというデザインになっています。

なんでそう変わったんでしたっけ?

--
--- 僕の前にBugはない。
--- 僕の後ろにBugはできる。
    中田 伸悦

Reply | Threaded
Open this post in threaded view
|

[ruby-dev:40460] Re: [Bug #2776] can't return from lambda with outer block

Tanaka Akira-3
2010年2月22日19:29 Nobuyoshi Nakada <[hidden email]>:
>
> なんでそう変わったんでしたっけ?

return でどこを抜けるかが変化するのって、ふつう困るんじゃないですかねぇ。

でも 1.9 で

% ./ruby -ve '
def m(&b)
  p yield
  2
end
def n
  l = lambda { return 1 }
  m(&l)
end
p n
'
ruby 1.9.2dev (2010-02-22 trunk 26728) [i686-linux]
1

は変わって変だなぁ。
--
[田中 哲][たなか あきら][Tanaka Akira]