[#28942] FUNC_CDECL/FUNC_STDCALL are not defined? — KIMURA Koichi <kimura.koichi@...>

木村です。

24 messages 2006/07/03
[#28943] Re: FUNC_CDECL/FUNC_STDCALL are not defined? — "U.Nakamura" <usa@...> 2006/07/03

こんにちは、なかむら(う)です。

[#28945] Re: FUNC_CDECL/FUNC_STDCALL are not defined? — Takaaki Tateishi <ttate@...> 2006/07/03

U.Nakamura wrote:

[#28946] Re: FUNC_CDECL/FUNC_STDCALL are not defined? — "U.Nakamura" <usa@...> 2006/07/03

こんにちは、なかむら(う)です。

[#29006] block wrapper — Tanaka Akira <akr@...>

以前、[ruby-dev:28747] の pp.rb の問題を解決するのに

44 messages 2006/07/10
[#29007] Re: block wrapper — Yukihiro Matsumoto <matz@...> 2006/07/10

まつもと ゆきひろです

[#29008] Re: block wrapper — Tanaka Akira <akr@...> 2006/07/10

In article <1152541094.492146.23781.nullmailer@x31.priv.netlab.jp>,

[#29009] Re: block wrapper — Yukihiro Matsumoto <matz@...> 2006/07/10

まつもと ゆきひろです

[#29010] Re: block wrapper — Tanaka Akira <akr@...> 2006/07/10

In article <1152542689.441125.24418.nullmailer@x31.priv.netlab.jp>,

[#29022] Re: block wrapper — Tanaka Akira <akr@...> 2006/07/12

In article <87psgd8qb2.fsf@fsij.org>,

[#29078] Re: block wrapper — Tanaka Akira <akr@...> 2006/07/19

In article <87r70rdpeg.fsf@fsij.org>,

[#29466] Re: block wrapper — Tanaka Akira <akr@...> 2006/09/04

In article <871wshddvn.fsf@fsij.org>,

[#29584] Re: block wrapper — Tanaka Akira <akr@...> 2006/09/16

In article <87ac5g5a7i.fsf@fsij.org>,

[#29616] Re: block wrapper — Tanaka Akira <akr@...> 2006/09/26

In article <8764foo7s7.fsf@fsij.org>,

[#30777] Re: block wrapper — Tanaka Akira <akr@...> 2007/05/11

In article <87venar27i.fsf@fsij.org>,

[#30778] Re: block wrapper — Yukihiro Matsumoto <matz@...> 2007/05/11

まつもと ゆきひろです

[#30780] Re: block wrapper — Tanaka Akira <akr@...> 2007/05/12

In article <1178883053.645482.13087.nullmailer@x31.netlab.jp>,

[#30781] Re: block wrapper — Yukihiro Matsumoto <matz@...> 2007/05/12

まつもと ゆきひろです

[#30840] Re: block wrapper — Tanaka Akira <akr@...> 2007/05/30

In article <1178978140.846301.8164.nullmailer@x31.netlab.jp>,

[#30843] Re: block wrapper — Yukihiro Matsumoto <matz@...> 2007/05/30

まつもと ゆきひろです

[#30848] Re: block wrapper — SASADA Koichi <ko1@...> 2007/05/31

 ささだです。

[#30850] Re: block wrapper — Yukihiro Matsumoto <matz@...> 2007/05/31

まつもと ゆきひろです

[#30855] Re: block wrapper — Tanaka Akira <akr@...> 2007/05/31

In article <E1HtaMS-00041i-6U@x31>,

[#29013] problem in bignorm — "U.Nakamura" <usa@...>

こんにちは、なかむら(う)です。

14 messages 2006/07/10
[#29016] Re: problem in bignorm — Yukihiro Matsumoto <matz@...> 2006/07/11

まつもと ゆきひろです

[#29018] Re: problem in bignorm — "U.Nakamura" <usa@...> 2006/07/11

こんにちは、なかむら(う)です。

[#29019] Re: problem in bignorm — "U.Nakamura" <usa@...> 2006/07/11

こんにちは、なかむら(う)です。

[#29038] irb completion — Tadayoshi Funaba <tadf@...>

ふなばです。

22 messages 2006/07/17
[#29063] Re: irb completion — keiju@... (石塚圭樹) 2006/07/18

けいじゅ@いしつかです.

[#29064] Re: irb completion — Yukihiro Matsumoto <matz@...> 2006/07/18

まつもと ゆきひろです

[#29070] Re: irb completion — Ryan Davis <ryand-ruby@...> 2006/07/18

[#29093] Re: [ruby-cvs:17195] ruby/test/rss: * object.c (rb_mod_attr): make Module#attr to be an alias to — Tanaka Akira <akr@...>

In article <20060720173258.5D4BAC6781@lithium.ruby-lang.org>,

14 messages 2006/07/20
[#29096] Re: ruby/test/rss: * object.c (rb_mod_attr): make Module#attr to be an alias to — Yukihiro Matsumoto <matz@...> 2006/07/20

まつもと ゆきひろです

[#29097] Re: ruby/test/rss: * object.c (rb_mod_attr): make Module#attr to be an alias to — Tanaka Akira <akr@...> 2006/07/20

In article <1153423941.406034.21948.nullmailer@x31.priv.netlab.jp>,

[#29098] Re: ruby/test/rss: * object.c (rb_mod_attr): make Module#attr to be an alias to — Yukihiro Matsumoto <matz@...> 2006/07/20

まつもと ゆきひろです

[#29099] Re: ruby/test/rss: * object.c (rb_mod_attr): make Module#attr to be an alias to — Tanaka Akira <akr@...> 2006/07/20

In article <1153425319.663162.22588.nullmailer@x31.priv.netlab.jp>,

[#29101] Re: ruby/test/rss: * object.c (rb_mod_attr): make Module#attr to be an alias to — Yukihiro Matsumoto <matz@...> 2006/07/21

まつもと ゆきひろです

[#29148] Re: [ruby-cvs:17256] ruby, ruby: * time.c (time_to_s): generate RFC822 style date string. — WATANABE Hirofumi <eban@...>

わたなべです。

31 messages 2006/07/27
[#29149] Re: [ruby-cvs:17256] ruby, ruby: * time.c (time_to_s): generate RFC822 style date string. — "NARUSE, Yui" <naruse@...> 2006/07/27

成瀬です。

[#29151] Re: [ruby-cvs:17256] ruby, ruby: * time.c (time_to_s): generate RFC822 style date string. — Yukihiro Matsumoto <matz@...> 2006/07/27

まつもと ゆきひろです

[#29152] Re: [ruby-cvs:17256] ruby, ruby: * time.c (time_to_s): generate RFC822 style date string. — URABE Shyouhei <root@...> 2006/07/27

卜部です

[#29153] Re: [ruby-cvs:17256] ruby, ruby: * time.c (time_to_s): generate RFC822 style date string. — Yukihiro Matsumoto <matz@...> 2006/07/27

まつもと ゆきひろです

[#29155] Re: [ruby-cvs:17256] ruby, ruby: * time.c (time_to_s): generate RFC822 style date string. — URABE Shyouhei <root@...> 2006/07/27

卜部です。

[#29157] Re: [ruby-cvs:17256] ruby, ruby: * time.c (time_to_s): generate RFC822 style date string. — "NARUSE, Yui" <naruse@...> 2006/07/27

成瀬です。

[#29159] Re: [ruby-cvs:17256] ruby, ruby: * time.c (time_to_s): generate RFC822 style date string. — Yukihiro Matsumoto <matz@...> 2006/07/27

まつもと ゆきひろです

[#29440] Re: [ruby-cvs:17256] ruby, ruby: * time.c (time_to_s): generate RFC822 style date string. — "NARUSE, Yui" <naruse@...> 2006/09/03

成瀬です

[#29462] Re: [ruby-cvs:17256] ruby, ruby: * time.c (time_to_s): generate RFC822 style date string. — Yukihiro Matsumoto <matz@...> 2006/09/04

まつもと ゆきひろです

[#29467] Re: [ruby-cvs:17256] ruby, ruby: * time.c (time_to_s): generate RFC822 style date string. — "NARUSE, Yui" <naruse@...> 2006/09/04

成瀬です。

[#29472] Re: [ruby-cvs:17256] ruby, ruby: * time.c (time_to_s): generate RFC822 style date string. — Yukihiro Matsumoto <matz@...> 2006/09/04

まつもと ゆきひろです

[#29483] Re: [ruby-cvs:17256] ruby, ruby: * time.c (time_to_s): generate RFC822 style date string. — "NARUSE, Yui" <naruse@...> 2006/09/05

成瀬です。

[#29488] Re: [ruby-cvs:17256] ruby, ruby: * time.c (time_to_s): generate RFC822 style date string. — Yukihiro Matsumoto <matz@...> 2006/09/05

まつもと ゆきひろです

[#29494] Re: [ruby-cvs:17256] ruby, ruby: * time.c (time_to_s): generate RFC822 style date string. — Tadayoshi Funaba <tadf@...> 2006/09/05

ふなばです。

[#29497] Re: [ruby-cvs:17256] ruby, ruby: * time.c (time_to_s): generate RFC822 style date string. — Yukihiro Matsumoto <matz@...> 2006/09/05

まつもと ゆきひろです

[#29513] Re: [ruby-cvs:17256] ruby, ruby: * time.c (time_to_s): generate RFC822 style date string. — Tadayoshi Funaba <tadf@...> 2006/09/06

> 郵便局の消印は採用できないんですが、なにが良いと思いますか。

[#29516] Re: [ruby-cvs:17256] ruby, ruby: * time.c (time_to_s): generate RFC822 style date string. — Yukihiro Matsumoto <matz@...> 2006/09/06

まつもと ゆきひろです

[ruby-dev:29022] Re: block wrapper

From: Tanaka Akira <akr@...>
Date: 2006-07-12 11:49:42 UTC
List: ruby-dev #29022
In article <87psgd8qb2.fsf@fsij.org>,
  Tanaka Akira <akr@fsij.org> writes:

> えー、*ba で 受けて yield(*ba) で送るって、件の
> http://www.ruby-lang.org/cgi-bin/cvsweb.cgi/ruby/lib/pp.rb.diff?r1=1.47;r2=1.48
> の変更以前のやりかたそのままじゃないですか。
>
> ということはそれでぜんぶうまくいくはずはなくて、調べてみると
> やっぱりうまくいかない例が出てきます。

系統的に調べる気になって、スクリプトを書いて調べて見ました。

その結果、1.8 でも完全な wrapper は書けていなかった、という
ことが判明してしまいました。

いちばんましなのは 1.8 での {|*v| yield(*v) } ですが、それで
も以下のように違いが出ることがあります。

% ruby-1.8 -ve '
def m() yield [] end
m {|v1,v2| p [v1,v2] }
def w() m {|*v| yield(*v) } end
w {|v1,v2| p [v1,v2] }'
ruby 1.8.4 (2006-06-08) [i686-linux]
[nil, nil]
[[], nil]

いろいろなケースを自動生成し、直接呼ぶのとラッパーを通して呼
ぶのの結果が異なるものを数えてみると、以下のようになりました。

% ~/ruby/18/ruby/ruby check.rb 
{|*v| yield(*v) }:      2332/29304      7.95795795795796%
{|v| yield(v) }:        7092/29304      24.2014742014742%
{|*v| b.call(*v) }:     4475/29304      15.2709527709528%
{|v| b.call(v) }:       14545/29304     49.6348621348621%
% ~/ruby/18/ruby/ruby -v
ruby 1.8.5 (2006-07-11) [i686-linux]

% ~/ruby/19/ruby/ruby check.rb
{|*v| yield(*v) }:      11484/43956     26.1261261261261%
{|v| yield(v) }:        18989/43956     43.2000182000182%
{|*v| b.call(*v) }:     12688/43956     28.8652288652289%
{|v| b.call(v) }:       36376/43956     82.7554827554828%
{|*v| b.yield(*v) }:    11751/43956     26.7335517335517%
{|v| b.yield(v) }:      18974/43956     43.1658931658932%
% ~/ruby/19/ruby/ruby -v      
ruby 1.9.0 (2006-07-12) [i686-linux]

最初の
{|*v| yield(*v) }:      2332/29304      7.95795795795796%
というのが一番成績が良くて、29304種類のテストのうち、結果が
異なる (ラッパーが影響してしまう) のが 2332種類しかなく、
約8% しか失敗していないということを示しています。

なお、1.8 と 1.9 でテストの数が違うのは Proc#yield の有無で
す。

で、この結果をどう考えるかですが、いままでやってこれたんだか
ら完全なラッパーなんて書けなくても構わない、と考えるか、やは
り欲しいのでどうにか、と考えるか、どうかなぁ。

ただ、1.9 の挙動はラッパーを書くという観点からは悪化していま
すね。少なくともここで生成しているテストの範囲でいえば。

block-wrapper.rb:

ARGS = %W[
  #{}
  v1
  v1,v2
  *v1
  v1,*v2
  v1,v2,*v3
]

YIELDS = %W[
  yield
  b.yield
  b.call
]
YIELDS.delete("b.yield") unless lambda{}.respond_to? :yield

VALUES = %W[
  0
  []
  [0]
  [[]]
  [[0]]
  [[[]]]
  [0,0]
  [0,[]]
  [[],0]
  [[],[]]
]

WRAPPERS = [
  "{|*v| yield(*v) }",
  "{|v| yield(v) }",
  "{|*v| b.call(*v) }",
  "{|v| b.call(v) }",
  "{|*v| b.yield(*v) }",
  "{|v| b.yield(v) }",
]
WRAPPERS.reject! {|b| /b.yield/ =~ b } unless lambda{}.respond_to? :yield

CALLEE = {}
def define_callee
  name = "t00"
  ns = []
  ARGS.each {|as|
    vars = as.scan(/v\d/)
    vars << '&b'
    YIELDS.each {|y|
      d = "def #{name}(#{vars.join(',')}) #{y}(#{as}) end"
      n = name.dup
      CALLEE[n] = d
      puts d if $VERBOSE
      eval(d)
      ns << n
      name.succ!
    }
  }
  ns
end

callee_names = define_callee

def perm(vs, n)
  if n == 0
    yield []
  else
    perm(vs, n-1) {|vv|
      vs.each {|v| yield vv + [v] }
    }
  end
end

def check_wrapper(callee_names)
  error = 0
  numtests = 0
  callee_names.each {|callee|
    arity = method(callee).arity
    perm(VALUES, arity) {|vv|
      ARGS.each {|as|
        vars = as.scan(/v\d/)
        block = "{|#{as}| r0 = [#{vars.join(',')}] }"
        block1 = block.sub(/r0/, "r1")
        block2 = block.sub(/r0/, "r2")
        code1 = <<"End".gsub(/^ */, '')
          r1 = nil; #{callee}(#{vv.join(',')}) #{block1}
          r2 = nil; wrapper(#{([":"+callee]+vv).join(',')}) #{block2}
End
        code2 = <<"End".gsub(/^ */, '')
          numtests += 1
          if r1 != r2
            error += 1
            if $VERBOSE
              puts
              puts CALLEE[#{callee.dump}]
              puts code1
              p r1
              p r2
            end
          end
End
        eval code1 + code2

        code1 = <<"End".gsub(/^ */, '')
          r1 = nil; #{callee}(#{(vv+["&lambda #{block1}"]).join(',')}) rescue r1 = $!
          r2 = nil; wrapper(#{([":"+callee]+vv+["&lambda #{block2}"]).join(',')}) rescue r2 = $!
End
        eval code1 + code2

      }
    }
  }
  [error, numtests]
end

$VERBOSE = nil if !$VERBOSE

WRAPPERS.each {|w|
  eval "def wrapper(n, *as, &b) __send__(n, *as) #{w} end"
  error, numtests = check_wrapper(callee_names)
  puts "#{w}:\t#{error}/#{numtests}\t#{error*100.0/numtests}%"
  undef wrapper
}
-- 
[田中 哲][たなか あきら][Tanaka Akira]

In This Thread