Block wrapper

e$B0JA0!“e(B[ruby-dev:28747] e$B$Ne(B pp.rb e$B$NLdBj$r2r7h$9$k$N$Ke(B
http://www.ruby-lang.org/cgi-bin/cvsweb.cgi/ruby/lib/pp.rb.diff?r1=1.47;r2=1.48
e$B$H$$$&JQ99$,$”$j$^$7$?$,!"%a%=%C%I$N%i%C%Q$Oe(B
o.m {|v| yield v }
e$B$H=q$1$k$h$&$K$J$C$?$N$G$7$g$&$+e(B?

e$B$$$/$D$+;n$7$F$_$k$H!"e(B

% ./ruby -e ’
def m(&b)
b.call *[]
end
def w(*args)
m(*args) {|bargs| yield bargs }
end
m {|*x| p x }
w {|*x| p x }

[]
[nil]

e$B$H$$$&$h$&$K!"%i%C%Qe(B w
e$B$rDL$9$+DL$5$J$$$+$G7k2L$,0[$J$k$3$H$,$"$j$^$9!#e(B

e$B$^$?!"e(B[ruby-dev:28747] e$B$G$NLdBj$N$h$&$K!“e(B
o.m {|*v| yield *v } e$B$G$b7k2L$,0[$J$k$3$H$,$”$j$^$9!#e(B

% ./ruby -ve ’
def m
yield [1]
end
def w(*args, &b)
m(*args) {|*bargs| b.call(*bargs) }
end
m {|x| p x }
w {|x| p x }

ruby 1.9.0 (2006-07-10) [i686-linux]
[1]
1

e$B8F$S=P$7$+$?$H<u$1<h$j$+$?$,$I$s$J$b$N$G$b7k2L$,JQ$o$i$J$$$he(B
e$B$&$J%i%C%Q$O$I$&=q$1$PNI$$$N$G$7$g$&e(B?

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

In message “Re: [ruby-dev:29006] block wrapper”
on Mon, 10 Jul 2006 20:14:48 +0900, Tanaka A. [email protected]
writes:

|e$B0JA0!“e(B[ruby-dev:28747] e$B$Ne(B pp.rb e$B$NLdBj$r2r7h$9$k$N$Ke(B
|http://www.ruby-lang.org/cgi-bin/cvsweb.cgi/ruby/lib/pp.rb.diff?r1=1.47;r2=1.48
|e$B$H$$$&JQ99$,$”$j$^$7$?$,!"%a%=%C%I$N%i%C%Q$Oe(B
|o.m {|v| yield v }
|e$B$H=q$1$k$h$&$K$J$C$?$N$G$7$g$&$+e(B?

e$B$$$$$(!#e(Byielde$B$r;H$C$FG$0U$N>uBV$r$=$N$^$^EO$9L/0F$O;W$$$D$$e(B
e$B$F$$$^$;$s!#e(B

|def w(*args)
| m(*args) {|bargs| yield bargs }
|end

e$B$NBe$o$j$Ke(B

def w(*args, &b)
m(*args, &b)
end

e$B$r;H$C$F$/[email protected]$5$$!"$G$O%@%a$G$7$g$&$+$M!#e(B

In article [email protected],
Yukihiro M. [email protected] writes:

e$B$$$$$(!#e(Byielde$B$r;H$C$FG$0U$N>uBV$r$=$N$^$^EO$9L/0F$O;W$$$D$$e(B
e$B$F$$$^$;$s!#e(B

e$B$U$`!#$=$l$O:$$j$^$7$?!#e(B

e$B$r;H$C$F$/[email protected]$5$$!"$G$O%@%a$G$7$g$&$+$M!#e(B
pp.rb e$B$N>l9g!"e(B
http://www.ruby-lang.org/cgi-bin/cvsweb.cgi/ruby/lib/pp.rb.diff?r1=1.47;r2=1.48
e$B$NJQ99$N<[email protected]$1$l$P$o$+$k$H$O;W$$$^$9$,!“C1$K%V%m%Ce(B
e$B%/$rE>[email protected]$1$G$J$/!”=hM}$rIU2C$7$^$9!#e(B

e$B$=$N$?$a!"e(B&b [email protected]$1$G$O9T$$$?$$A`:n$r<B8=$G$-$^$;$s!#e(B

In article [email protected],
Yukihiro M. [email protected] writes:

e$B$=$&$G$9$+!#$H$j$"$($:!";XE&$5$l$?FsNc$K$D$$$F$Oe(B

def w1(*args, &b)
m1(*args) {|*bargs| yield(*bargs) }
end

e$B$,F0:n$7$^$9!#$,!":,K\E*$KLdBj$,2r7h$5$l$?<+?.$O%<%m$G$9$7!“e(B
b.yielde$B$He(Byielde$B$N5sF0$,0c$&$H$$$&$”$^$j$&$l$7$/$J$$;v<B$b;D$je(B
e$B$^$9!#$b$&$A$g$C$H9M$($^$9!#e(B

e$B$(!<!"e(B*ba e$B$Ge(B e$B<u$1$Fe(B yield(*ba) e$B$GAw$k$C$F!"7o$Ne(B
http://www.ruby-lang.org/cgi-bin/cvsweb.cgi/ruby/lib/pp.rb.diff?r1=1.47;r2=1.48
e$B$NJQ990JA0$N$d$j$+$?$=$N$^$^$8$c$J$$$G$9$+!#e(B

e$B$H$$$&$3$H$O$=$l$G$<$s$V$&$^$/$$$/$O$:$O$J$/$F!"D4$Y$F$_$k$He(B
e$B$d$C$Q$j$&$^$/$$$+$J$$Nc$,=P$F$-$^$9!#e(B

% ./ruby -ve ’
def m(&b)
yield 1
end
def w(*args)
m(*args) {|*bargs| yield(*bargs) }
end
m {|x| p x }
w {|x| p x }

ruby 1.9.0 (2006-07-10) [i686-linux]
1
[1]

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

In message “Re: [ruby-dev:29008] Re: block wrapper”
on Mon, 10 Jul 2006 23:37:27 +0900, Tanaka A. [email protected]
writes:

|> def w(*args, &b)
|> m(*args, &b)
|> end
|>
|> e$B$r;H$C$F$/[email protected]$5$$!"$G$O%@%a$G$7$g$&$+$M!#e(B
|
|pp.rb e$B$N>l9g!"e(B
|http://www.ruby-lang.org/cgi-bin/cvsweb.cgi/ruby/lib/pp.rb.diff?r1=1.47;r2=1.48
|e$B$NJQ99$N<[email protected]$1$l$P$o$+$k$H$O;W$$$^$9$,!“C1$K%V%m%Ce(B
|e$B%/$rE>[email protected]$1$G$J$/!”=hM}$rIU2C$7$^$9!#e(B
|
|e$B$=$N$?$a!"e(B&b [email protected]$1$G$O9T$$$?$$A`:n$r<B8=$G$-$^$;$s!#e(B

e$B$=$&$G$9$+!#$H$j$"$($:!";XE&$5$l$?FsNc$K$D$$$F$Oe(B

def w1(*args, &b)
m1(*args) {|*bargs| yield(*bargs) }
end

e$B$,F0:n$7$^$9!#$,!":,K\E*$KLdBj$,2r7h$5$l$?<+?.$O%<%m$G$9$7!“e(B
b.yielde$B$He(Byielde$B$N5sF0$,0c$&$H$$$&$”$^$j$&$l$7$/$J$$;v<B$b;D$je(B
e$B$^$9!#$b$&$A$g$C$H9M$($^$9!#e(B

In article [email protected],
Tanaka A. [email protected] writes:

e$B$(!<!"e(B*ba e$B$Ge(B e$B<u$1$Fe(B yield(*ba) e$B$GAw$k$C$F!"7o$Ne(B
http://www.ruby-lang.org/cgi-bin/cvsweb.cgi/ruby/lib/pp.rb.diff?r1=1.47;r2=1.48
e$B$NJQ990JA0$N$d$j$+$?$=$N$^$^$8$c$J$$$G$9$+!#e(B

e$B$H$$$&$3$H$O$=$l$G$<$s$V$&$^$/$$$/$O$:$O$J$/$F!"D4$Y$F$_$k$He(B
e$B$d$C$Q$j$&$^$/$$$+$J$$Nc$,=P$F$-$^$9!#e(B

e$B7OE}E*$KD4$Y$k5$$K$J$C$F!"%9%/%j%W%H$r=q$$$FD4$Y$F8+$^$7$?!#e(B

e$B$=$N7k2L!“e(B1.8 e$B$G$b40A4$Je(B wrapper
e$B$O=q$1$F$$$J$+$C$?!”$H$$$&e(B
e$B$3$H$,[email protected]$7$F$7$^$$$^$7$?!#e(B

e$B$$$A$P$s$^$7$J$N$Oe(B 1.8 e$B$G$Ne(B {|*v| yield(*v) }
e$B$G$9$,!"$=$l$Ge(B
e$B$b0J2<$N$h$&$K0c$$$,=P$k$3$H$,$"$j$^$9!#e(B

% 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]

e$B$$$m$$$m$J%1!<%9$r<[email protected]@.$7!"D>@\8F$V$N$H%i%C%Q!<$rDL$7$F8Fe(B
e$B$V$N$N7k2L$,0[$J$k$b$N$r?t$($F$_$k$H!"0J2<$N$h$&$K$J$j$^$7$?!#e(B

% ~/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]

e$B:G=i$Ne(B
{|*v| yield(*v) }: 2332/29304 7.95795795795796%
e$B$H$$$&$N$,[email protected]@S$,NI$/$F!"e(B29304e$B<oN$N%F%9%H$N$&$A!"7k2L$,e(B e$B0[$J$ke(B (e$B%i%C%Q!<$,1F6A$7$F$7$^$&e(B) e$B$N$,e(B 2332e$B<oN$7$+$J$/!"e(B
e$BLse(B8% e$B$7$+<:GT$7$F$$$J$$$H$$$&$3$H$r<($7$F$$$^$9!#e(B

e$B$J$*!"e(B1.8 e$B$He(B 1.9 e$B$G%F%9%H$N?t$,0c$&$N$Oe(B Proc#yield
e$B$NM-L5$Ge(B
e$B$9!#e(B

e$B$G!"$3$N7k2L$r$I$&9M$($k$+$G$9$,!"$$$^$^[email protected]$+e(B
e$B$i40A4$J%i%C%Q!<$J$s$F=q$1$J$/$F$b9=$o$J$$!"$H9M$($k$+!"$d$Oe(B
e$B$jM_$7$$$N$G$I$&$K$+!"$H9M$($k$+!"$I$&$+$J$!!#e(B

[email protected]!"e(B1.9 e$B$N5sF0$O%i%C%Q!<$r=q$/$H$$$&[email protected]$+$i$O0-2=$7$F$$$^e(B
e$B$9$M!#>/$J$/[email protected]@.$7$F$$$k%F%9%H$NHO0O$G$$$($P!#e(B

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
}

In article [email protected],
Tanaka A. [email protected] writes:

e$B7OE}E*$KD4$Y$k5$$K$J$C$F!"%9%/%j%W%H$r=q$$$FD4$Y$F8+$^$7$?!#e(B

e$B$3$N%9%/%j%W%H$,4V0c$C$F$$$?$N$GD>$7$F!"$$$m$$$m$H9M$($F$_$^$7$?!#e(B

% ~/ruby/19/ruby/ruby block-wrapper.rb

{|*v|yield(*v)}: 1259/43956 2.86422786422786%
{|v|yield(v)}: 11945/43956 27.1749021749022%
{|*v|b.call(*v)}: 2463/43956 5.6033306033306%
{|v|b.call(v)}: 36199/43956 82.3528073528073%
{|*v|b.yield(*v)}: 1589/43956 3.61497861497861%
{|v|b.yield(v)}: 11910/43956 27.0952770952771%

% ~/ruby/18/ruby/ruby block-wrapper.rb

{|*v|yield(*v)}: 2332/29304 7.95795795795796%
{|v|yield(v)}: 7092/29304 24.2014742014742%
{|*v|b.call(*v)}: 2260/29304 7.71225771225771%
{|v|b.call(v)}: 14470/29304 49.3789243789244%

1.8 e$B$Ne(B {|*v|yield(*v)} e$B$GLse(B8% [email protected]$C$?<:GTN($,e(B 1.9
e$B$Ne(B
{|*v|yield(*v)} e$B$GLse(B3% e$B$K2<$,$C$F$$$k$N$G!"?t$H$7$F$O8:$C$Fe(B
e$B$$$^$9!#e(B

[email protected]!"e(Bpp.rb e$B$N<:GT$N$h$&$K!"8D!9$NNc$K$D$$$F$O0JA0$Oe(B wrapper
e$B$K$J$C$F$$$?$b$N$,e(B wrapper e$B$K$J$i$J$/$J$C$F$7$^$C$?$b$N$b$"e(B
e$B$j$^$9$+$i!"C1=c$K2~A1$H$O$$$($^$;$s!#e(B

e$B$H$$$&$+!"<:GT$7$?Nc$rHf$Y$F$_$k$H!“e(B1.9 e$B$G$N<:GT$O$9$Y$F<u$1e(B
e$BB&$N%V%m%C%/$,e(B {|v| … } e$B$H$$$&$R$H$D$NJQ?t$N%1!<%9$G$”$k$Ne(B
e$B$KBP$7!“e(B1.8 e$B$G$N<:GT$OA4$F$=$&$G$J$$e(B ({|| … }
e$B$HJQ?t$,$R$He(B
e$B$D$b$J$$$+e(B {|v1, v2| … } e$B$J$IJQ?t$,e(B 2e$B$D0J>e$”$ke(B)
e$B%1!<%9$Ge(B
e$B$9!#e(Bwrapper [email protected]$+$i8+$k$H!“2~A1$H$$$&$h$j$O!”$&$^$/$$$+$Je(B
e$B$$;E3]$1$+$i$d$C$Q$j$&$^$/$$$+$J$$B>$N;E3]$1$KJQ$o$C$?$H$$$&e(B
e$B0u>]$G$9!#e(B

e$B$=$7$F!“e(B1.9 e$B$Ge(B {|*v|yield(v)} e$B$H$$$&e(B wrapper
e$B$,$&$^$/$$$+$Je(B
e$B$$Nc$rD4$Y$F$$k$H!"$[$H$s$I$Oe(B b.call e$B$G%V%m%C%/[email protected]>l9ge(B
e$B$G$9!#9M$($F$
$k$H!"$3$l$Oe(B yield e$B$He(B call
e$B$N0c$$$r;H$C$F9)IWe(B
e$B$7$h$&$H$$$&J}?K$+$iG<[email protected]$G$-$^$9!#e(Byield e$B$He(B call
e$B$O0c$&$N$G$9e(B
e$B$+$i!"$=$l$i$r6hJL$;$:$Ke(B yield e$B$GCf7Q$9$l$P$
$+$7$J$3$H$K$Je(B
e$B$k$N$OA[A|$KFq$/$”$j$^$;$s!#e(B

e$B$^$?!“e(B{|*v|b.call(*v)} e$B$re(B wrapper
e$B$H$7$F;H$&$H!”$&$^$/$$$+$Je(B
e$B$$%1!<%9$O$9$Y$F$,e(B yield e$B$+e(B b.yield
e$B$G%V%m%C%/[email protected]>l9g$Ge(B
e$B$9!#$3$l$bF1MM$K7o$NJ}?K$+$iG<[email protected]$G$-$^$9!#e(B

e$B$3$3$G!"6=L#?<$$$N$O!“e(B{|*v|yield(*v)} e$B$N>l9g$K$O<:GT$Ne(B
e$B!V$[$H$s$I!W$,e(B b.call e$B$K4X$9$k$b$N$G$”$k$N$KBP$7!"e(B
{|*v|b.call(*v)} e$B$N>l9g$K$O<:GT$N!V$9$Y$F!W$,e(B yield e$B$He(B
b.yield [email protected]$H$$$&0c$$$G$9!#e(B

e$B$3$3$G5?Ld$,$"$k$N$G$9$,!"e(Byield e$B$re(B e$B8=:_$Ne(B 1.9 e$B$Ne(B
b.call e$B$NF0e(B
e$B:n$K$7$F$7$^$o$J$$$N$O$J$s$G$G$7$g$&e(B?

e$B$b$7$=$&$J$C$F$/$l$l$P!"8=:_$Ne(B ({|*v|b.call(*v)} e$B$G$N<:GT$Ne(B
e$B860x$Ne(B) yield/b.yield e$B$O$J$/$J$C$F!"40A4$KF0$/e(B wrapper
e$B$,<Be(B
e$B8=$G$-$k$N$G$9$,!#e(B

ARGS = [
#nil,
“”,
“v1”,
“v1,v2”,
“*v1”,
“v1,*v2”,
“v1,v2,*v3”,
#“v1,*v2,v3”,
#"*v1,v2",
#"*v1,v2,v3"
]

YIELDS = %W[
yield
b.yield
b.call
]

VALUES = [
0,
[],
[0],
[[]],
[[0]],
[[[]]],
[0,0],
[0,[]],
[[],0],
[[],[]]
]

WRAPBLOCKS = [
“{|*v|yield(*v)}”,
“{|v|yield(v)}”,
“{|*v|b.call(*v)}”,
“{|v|b.call(v)}”,
“{|*v|b.yield(*v)}”,
“{|v|b.yield(v)}”,
]

unless lambda{}.respond_to? :yield
YIELDS.delete(“b.yield”)
WRAPBLOCKS.reject! {|b| /b.yield/ =~ b }
end

def calleeNN(vv) YIELD(ARGS) end

def callerNN(callee_name, *vs) send(callee_name, *vs) {|ARGS| …

} end

def callerNN(callee_name, *vs) send(callee_name, *vs, &lambda

{|ARGS| … }) end

def wrapperNN(callee_name, *vs) send(callee_name, *vs) WRAPBLOCK

end

CALLEE = []
def define_callee
name = “callee00”
ARGS.each {|as|
next if !as
vars = as.scan(/v\d/)
varsb = (vars+[’&b’]).join(’,’)
YIELDS.each {|y|
name.succ!
n = name.dup
eval “def #{n}(#{varsb}) #{y}(#{as}) end”
CALLEE << [n, [vars.length, “#{y}(#{as})”]]
}
}
end
define_callee

CALLER = []
def define_caller
name = “caller00”
ARGS.each {|as|
vars = as ? as.scan(/v\d/) : []
as = as ? “|#{as}|” : ‘’
name.succ!
n = name.dup
eval “def #{n}(callee_name, *vs) send(callee_name, *vs) {#{as}
[#{vars.join(’,’)}] } end”
CALLER << [n, “{#{as}}”]
}
ARGS.each {|as|
vars = as ? as.scan(/v\d/) : []
as = as ? “|#{as}|” : ‘’
name.succ!
n = name.dup
eval “def #{n}(callee_name, *vs) send(callee_name, *vs, &lambda
{#{as} [#{vars.join(’,’)}] }) end”
CALLER << [n, “&{#{as}}”]
}
end
define_caller

WRAPPER = []
def define_wrapper
name = “wrapper00”
WRAPBLOCKS.each {|w|
name.succ!
n = name.dup
w2 = w.sub(/|.*|/) { $& + “$wrapper_value = v;” }
eval “def #{n}(callee_name, *vs, &b) send(callee_name, *vs)
#{w2} end”
WRAPPER << [n, w]
}
end
define_wrapper

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

$VERBOSE = nil

def check(callee_name, callee_desc, wrapper_name, wrapper_desc,
caller_name, caller_desc, vs)
r1 = (send(caller_name, callee_name, *vs) rescue $!)
r2 = (send(caller_name, wrapper_name, callee_name, *vs) rescue $!)
wv = $wrapper_value
success = r1 == r2 || (r1.kind_of?(Exception) &&
r2.kind_of?(Exception) && r1.class == r2.class && r1.message ==
r2.message)
print(success ? “succ\t” : “fail\t”)
vs2 = vs.dup
cd = callee_desc.gsub(/v\d/) { vs2.shift.inspect }.gsub(/ /, ‘’)
wd = (wrapper_desc + ‘/’ + wv.inspect).gsub(/ /, ‘’)
r1 = r1.inspect.gsub(/ /, r1.kind_of?(Exception) ? ‘’ : ‘’)
r2 = r2.inspect.gsub(/ /, r2.kind_of?(Exception) ? '
’ : ‘’)
print cd, “\t”
print wd, “\t”
print caller_desc, “\t”
print r1, “\t”
print r2, “\n”
success
end

count = {}
error = {}
WRAPPER.each {|wrapper_name, wrapper_desc|
count[wrapper_desc] = 0
error[wrapper_desc] = 0
CALLEE.each {|callee_name, (callee_arity, callee_desc)|
perm(VALUES, callee_arity) {|vs|
CALLER.each {|caller_name, caller_desc|
count[wrapper_desc] += 1
success = check(callee_name, callee_desc, wrapper_name,
wrapper_desc, caller_name, caller_desc, vs)
error[wrapper_desc] += 1 if !success
}
}
}
puts
}

WRAPPER.each {|wrapper_name, wrapper_desc|
c = count[wrapper_desc]
e = error[wrapper_desc]
puts “#{wrapper_desc}:\t#{e}/#{c}\t#{e*100.0/c}%”
}

In article [email protected],
Tanaka A. [email protected] writes:

e$B$3$3$G5?Ld$,$"$k$N$G$9$,!"e(Byield e$B$re(B e$B8=:_$Ne(B 1.9 e$B$Ne(B b.call e$B$NF0e(B
e$B:n$K$7$F$7$^$o$J$$$N$O$J$s$G$G$7$g$&e(B?

e$BJV;v$rBT$C$F$$$k$s$G$9$,!"$J$s$G$J$s$G$7$g$&e(B?

In article [email protected],
Tanaka A. remo[email protected] writes:

e$B$3$3$G5?Ld$,$"$k$N$G$9$,!"e(Byield e$B$re(B e$B8=:_$Ne(B 1.9 e$B$Ne(B b.call e$B$NF0e(B
e$B:n$K$7$F$7$^$o$J$$$N$O$J$s$G$G$7$g$&e(B?

e$BJV;v$rBT$C$F$$$k$s$G$9$,!"$J$s$G$J$s$G$7$g$&e(B?

e$B$d$O$j5?Ld$G!"$H$F$bCN$j$?$$$N$G$9$,!"$J$s$G$J$s$G$7$g$&e(B?

In article [email protected],
Tanaka A. [email protected] writes:

e$B$3$3$G5?Ld$,$"$k$N$G$9$,!"e(Byield e$B$re(B e$B8=:_$Ne(B 1.9 e$B$Ne(B b.call e$B$NF0e(B
e$B:n$K$7$F$7$^$o$J$$$N$O$J$s$G$G$7$g$&e(B?

e$BJV;v$rBT$C$F$$$k$s$G$9$,!"$J$s$G$J$s$G$7$g$&e(B?

e$B$d$O$j5?Ld$G!"$H$F$bCN$j$?$$$N$G$9$,!"$J$s$G$J$s$G$7$g$&e(B?

[email protected]$o$j$,$"$k$N$+$o$+$i$J$$$N$G5$$KF~$k$+$I$&$+$O$o$+e(B
e$B$i$J$$$N$G$9$,!";d$H$7$F$O<!$N$h$&$K$7$?$i$$$$$N$G$O$J$$$+$He(B
e$B;W$C$F$$$^$9!#e(B

e$B$J$s$H$J$/JV;v$rBT$C$F$$$k4V$KH>G/$[$I$?$C$F$7$^$$$^$7$?$,!"e(B
[email protected]$o$C$F$$$k$H$3$m$r;W$$=P$7$^$7$?$G$7$g$&$+e(B?

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

In message “Re: [ruby-dev:30777] Re: block wrapper”
on Fri, 11 May 2007 18:49:52 +0900, Tanaka A. [email protected]
writes:

|> [email protected]$o$j$,$"$k$N$+$o$+$i$J$$$N$G5$$KF~$k$+$I$&$+$O$o$+e(B
|> e$B$i$J$$$N$G$9$,!";d$H$7$F$O<!$N$h$&$K$7$?$i$$$$$N$G$O$J$$$+$He(B
|> e$B;W$C$F$$$^$9!#e(B
|
|e$B$J$s$H$J$/JV;v$rBT$C$F$$$k4V$KH>G/$[$I$?$C$F$7$^$$$^$7$?$,!"e(B
|[email protected]$o$C$F$$$k$H$3$m$r;W$$=P$7$^$7$?$G$7$g$&$+e(B?

e$B$$$(!"[email protected]$$$V9M$($?$N$K;W$$=P$;$J$+$C$?$N$G!"AGD>$KEDCf$5$s$Ne(B
e$BDs0F$r<u$1F~$l$k$3$H$K$7$^$7$?!#e(Bmatzrubye$B$K$O%Q%C%A$r<h$j$3$_e(B
e$B$^$7$?!#6aF|Cf$Ke(BYARVe$B$K$bH?1G$5$l$kM=Dj$G$9!#e(B

In article [email protected],
Yukihiro M. [email protected] writes:

e$B$$$(!"[email protected]$$$V9M$($?$N$K;W$$=P$;$J$+$C$?$N$G!"AGD>$KEDCf$5$s$Ne(B
e$BDs0F$r<u$1F~$l$k$3$H$K$7$^$7$?!#e(Bmatzrubye$B$K$O%Q%C%A$r<h$j$3$_e(B
e$B$^$7$?!#6aF|Cf$Ke(BYARVe$B$K$bH?1G$5$l$kM=Dj$G$9!#e(B

e$B$J$k$[$I!#e(B

e$B$H$9$k$H!"0J2<$N$h$&$Ke(B wrapper e$B7PM3$H$=$&$G$J$$>l9g$G7k2L$,e(B
e$B0[$J$k$H$3$m$OJQ$o$k$N$G$9$Me(B?

% ./ruby -ve ’
def m(&b)
b.yield()
end
def w
m {|*a| yield(*a) }
end
w(&lambda {|v,| p v })
m(&lambda {|v,| p v })

ruby 1.9.0 (2007-05-12 patchlevel 0) [i686-linux]
nil
-e:3:in yield': wrong number of arguments (0 for 1) (ArgumentError) from -e:3:inm’
from -e:9:in `’

[email protected]!"[email protected]$^$G$ON>J}$H$be(B nil e$B$G0lCW$7$F$$$?$N$G!“e(B
e$B3+H/$NJ}8~$H$7$F;d$NDs0F$,<u$1F~$l$i$l$k$H$$$&$h$j$O!“Ds0F$+e(B
e$B$i30$l$F$$$/J}8~$K$”$k$h$&$K;W$($k$s$G$9$,!”$I$&$J$s$G$7$g$&e(B
e$B$+e(B?

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

In message “Re: [ruby-dev:30780] Re: block wrapper”
on Sat, 12 May 2007 20:54:52 +0900, Tanaka A. [email protected]
writes:

|> e$B$$$(!"[email protected]$$$V9M$($?$N$K;W$$=P$;$J$+$C$?$N$G!"AGD>$KEDCf$5$s$Ne(B
|> e$BDs0F$r<u$1F~$l$k$3$H$K$7$^$7$?!#e(Bmatzrubye$B$K$O%Q%C%A$r<h$j$3$_e(B
|> e$B$^$7$?!#6aF|Cf$Ke(BYARVe$B$K$bH?1G$5$l$kM=Dj$G$9!#e(B
|
|e$B$J$k$[$I!#e(B
|
|e$B$H$9$k$H!"0J2<$N$h$&$Ke(B wrapper e$B7PM3$H$=$&$G$J$$>l9g$G7k2L$,e(B
|e$B0[$J$k$H$3$m$OJQ$o$k$N$G$9$Me(B?

e$B$=$N$O$:$G$9!#e(B

|[email protected]!"[email protected]$^$G$ON>J}$H$be(B nil e$B$G0lCW$7$F$$$?$N$G!“e(B
|e$B3+H/$NJ}8~$H$7$F;d$NDs0F$,<u$1F~$l$i$l$k$H$$$&$h$j$O!“Ds0F$+e(B
|e$B$i30$l$F$$$/J}8~$K$”$k$h$&$K;W$($k$s$G$9$,!”$I$&$J$s$G$7$g$&e(B
|e$B$+e(B?

e$B:#$^$Ge([email protected]?1G$7$F$$$^$;$s$+$i!"<u$1e(B
e$BF~$l$k$H$+30$l$k$H$+$$$&H/A[$O$J$$$G$9!#$,!":{ED$/$s$HOC$r$7e(B
e$B$F<u$1F~$l$F$b$i$&$h$&$K$*4j$$$7$^$7$?$+$i!":#8eBP1~$9$k$3$He(B
e$B$G$7$g$&!#e(B

e$B$A$J$_$Ke(Bmatzrubye$B$G$OEDCf$5$s$NNcBj$ON>J}$H$b%(%i!<$K$J$j$^$9!#e(B

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

In message “Re: [ruby-dev:30840] Re: block wrapper”
on Wed, 30 May 2007 13:30:11 +0900, Tanaka A. [email protected]
writes:

|e$B$J$k$[$I!#$G$O!"$$$D$4$m$=$&$J$k$N$G$7$g$&e(B?
|e$B$H$j$"$($:e(B 2e$B=54V$[$IBT$C$F$_$^$7$?$,!"$$$^$N$H$3$m$=$&$J$C$Fe(B
|e$B$O$$$J$$$h$&$G$9!#e(B

e$B$*BT$?$;$7$F$$$^$9!#[email protected]$/$s$N:n6H$K$J$k$HG’<1$7$F$$e(B
e$B$k$N$G$9$,!“H`$NB>$N%?%9%/$H$N7s$M9g$$$,$”$k$N$G!";d$NJ}$+$ie(B
e$B$$$D$K$J$k$+LsB+$9$k$N$O$G$-$J$$$N$G$9!#$4$a$s$J$5$$!#e(B

|e$B$"$H!"0JA0e(B yield *v e$B$Ge(B wrapper e$B$,F0$+$J$/$J$C$?;~$K$^$D$b$He(B
|e$B$5$s$,e(B pp.rb e$B$rJQ$([email protected]$1$^$;$s$+e(B?

e$B$3$l$O;d$NJ}$G:n6H$7$^$9!#:#$9$0La$;$k$J$i?tF|Cf$K!"e(BYARVe$B%3%"e(B
e$B$G$NBP1~$,I,MW$J$iBP1~8e$9$0$KLa$7$^$9!#e(B

In article [email protected],
Yukihiro M. [email protected] writes:

|e$B$H$9$k$H!"0J2<$N$h$&$Ke(B wrapper e$B7PM3$H$=$&$G$J$$>l9g$G7k2L$,e(B
|e$B0[$J$k$H$3$m$OJQ$o$k$N$G$9$Me(B?

e$B$=$N$O$:$G$9!#e(B

e$B$J$k$[$I!#$G$O!"$$$D$4$m$=$&$J$k$N$G$7$g$&e(B?
e$B$H$j$"$($:e(B 2e$B=54V$[$IBT$C$F$_$^$7$?$,!"$$$^$N$H$3$m$=$&$J$C$Fe(B
e$B$O$$$J$$$h$&$G$9!#e(B

e$B$"$H!"0JA0e(B yield *v e$B$Ge(B wrapper
e$B$,F0$+$J$/$J$C$?;~$K$^$D$b$He(B
e$B$5$s$,e(B pp.rb e$B$rJQ$([email protected]$1$^$;$s$+e(B?

[email protected]$G$9!#e(B

Yukihiro M. e$B$5$s$O=q$-$^$7$?e(B:

|e$B$J$k$[$I!#$G$O!"$$$D$4$m$=$&$J$k$N$G$7$g$&e(B?
|e$B$H$j$"$($:e(B 2e$B=54V$[$IBT$C$F$_$^$7$?$,!"$$$^$N$H$3$m$=$&$J$C$Fe(B
|e$B$O$$$J$$$h$&$G$9!#e(B

e$B$*BT$?$;$7$F$$$^$9!#[email protected]$/$s$N:n6H$K$J$k$HG’<1$7$F$$e(B
e$B$k$N$G$9$,!“H`$NB>$N%?%9%/$H$N7s$M9g$$$,$”$k$N$G!";d$NJ}$+$ie(B
e$B$$$D$K$J$k$+LsB+$9$k$N$O$G$-$J$$$N$G$9!#$4$a$s$J$5$$!#e(B

e$B!!:n6H$,CY$/$J$C$F:Q$_$^$;$s!#e(B

e$B!!;d$O!"$3$N7o$,0lBN2?$,$I$&$J$l$P$h$$$N$+$o$+$C$F$$$J$$$N$G$9e(B
e$B$,!“e(Bmake test
e$B$,A4ItDL$l$Pe(BOKe$B$H$$$&$3$H$J$s$G$7$g$&$+!J0JA0!”$=e(B
e$B$&;G$C$?5$$,$7$^$9!K!#:#$Ne(B trunk
e$B$G!V$3$3$O$3$&$7$m!W$H;XE&$7e(B
[email protected]$1$k$HBgJQ=u$+$j$^$9!#e(B

e$B!!$"$H!"e(BProc#yield
[email protected]$9$k$s$G$9$+!)!!J9$/[email protected]$&$3e(B
e$B$H$,0c$&$N$G!"$A$g$C$H$h$/$o$+$i$J$$$s$G$9$h$M!#:G=E$J;EMM$re(B
e$BC/$+65$($F$/[email protected]$5$$!#e(Bsample/test.rb e$B$K$Oe(B Proc#yield
e$B$OB8:
$7$^$9!#e(B

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

In message “Re: [ruby-dev:30848] Re: block wrapper”
on Thu, 31 May 2007 09:01:17 +0900, SASADA Koichi [email protected]
writes:

|e$B!!;d$O!"$3$N7o$,0lBN2?$,$I$&$J$l$P$h$$$N$+$o$+$C$F$$$J$$$N$G$9e(B
|e$B$,!“e(Bmake test e$B$,A4ItDL$l$Pe(BOKe$B$H$$$&$3$H$J$s$G$7$g$&$+!J0JA0!”$=e(B
|e$B$&;G$C$?5$$,$7$^$9!K!#:#$Ne(B trunk e$B$G!V$3$3$O$3$&$7$m!W$H;XE&$7e(B
|[email protected]$1$k$HBgJQ=u$+$j$^$9!#e(B

e$B$H$j$"$($:e(B[ruby-dev:29616][email protected]@$5$l$F$$$k5sF0e(B

  • b.call e$B$NF0:n$r4pK$H$7!"G[Ns$G%G!<%?$r<u$1EO$9e(B
  • |*x| e$B$G$=$NG[Ns$r<u$1<h$l!"e(Byield *x e$B$G$=$NG[[email protected]_Dj$G$-$ke(B
    (e$B%i%C%Q!<$,=q$1$ke(B)
  • e$B%G!<%?$r<u$1<h$k$H$3$m$G;H$$>!<[email protected]$r9M$($F$$$/$i$+:Ye(B
    e$B9)$r$9$ke(B

e$B$,4pK$G$9!#$G!"$3$l$K4^$^$l$F$$$k%F%9%H%1!<%9$N%Q%C%A$,DL$ke(B
e$B$N$,L\I8$K$J$j$^$9!#$^$?!“e(B[ruby-dev:29078]e$B$K$OLVMeE*$J%F%9%He(B
e$B$r9T$&%9%/%j%W%H$,$”$j$^$9$+$i!"$3$l$,e(B100%e$B$K$J$k$N$,3NG’;v9`e(B
e$B$K$J$k$H;W$$$^$9!#e(B

|e$B!!$"$H!"e(BProc#yield [email protected]$9$k$s$G$9$+!)!!J9$/[email protected]$&$3e(B
|e$B$H$,0c$&$N$G!"$A$g$C$H$h$/$o$+$i$J$$$s$G$9$h$M!#:G=E$J;EMM$re(B
|e$BC/$+65$($F$/[email protected]$5$$!#e(Bsample/test.rb e$B$K$Oe(B Proc#yield e$B$OB8:
$7$^$9!#e(B

[email protected]_$9$k$D$b$j$G$9!#e(B

In article [email protected],
SASADA Koichi [email protected] writes:

e$B!!;d$O!"$3$N7o$,0lBN2?$,$I$&$J$l$P$h$$$N$+$o$+$C$F$$$J$$$N$G$9e(B
e$B$,!“e(Bmake test e$B$,A4ItDL$l$Pe(BOKe$B$H$$$&$3$H$J$s$G$7$g$&$+!J0JA0!”$=e(B
e$B$&;G$C$?5$$,$7$^$9!K!#:#$Ne(B trunk e$B$G!V$3$3$O$3$&$7$m!W$H;XE&$7e(B
[email protected]$1$k$HBgJQ=u$+$j$^$9!#e(B

e$B$3$N%9%l%C%I$Ne(B [ruby-dev:29078] e$B$K=P$7$?$b$N$r3H=<$7$?%9%/%je(B
e$B%W%H$r$3$N%a!<%k$K$D$1$F$^$9$N$G;n$7$F$/[email protected]$5$$!#e(Bfail e$B$,$R$He(B
e$B$D$G$b$"$l$Pe(B wrapper e$B$K$J$C$F$$$J$$$H$$$&$3$H$K$J$j$^$9!#e(B

e$B<B:]!"e(B[ruby-dev:30780] e$B$G=P$7$?Nc$O$=$N%9%/%j%W%H$G8+IU$1$?e(B
e$B$b$N$G$9!#e(B

make test [email protected]$K4X$7$F$O?.MQ$7$F$$$^$;$s!#e(B

e$B!!$"$H!"e(BProc#yield [email protected]$9$k$s$G$9$+!)!!J9$/[email protected]$&$3e(B
e$B$H$,0c$&$N$G!"$A$g$C$H$h$/$o$+$i$J$$$s$G$9$h$M!#:G=E$J;EMM$re(B
e$BC/$+65$($F$/[email protected]$5$$!#e(Bsample/test.rb e$B$K$Oe(B Proc#yield e$B$OB8:
$7$^$9!#e(B

e$B$b$7!“e(BProc#yield e$B$re(B Proc#call
e$B$H0[[email protected]_$9$k$N$Je(B
e$B$i!”$=$N0c$$$Oe(B wrapper
e$B$G07$&CM$K$*$$$F$I$&I=8=$5$l$k$N$G$9$+e(B?

ARGS = [
nil,
“”,
“v1”,
“v1,”,
“v1,v2”,
“v1,v2,v3”,
“*v1”,
“v1,*v2”,
“v1,v2,*v3”,
“v1,v2,v3,*v4”,
#“v1,*v2,v3”,
#"*v1,v2",
#"*v1,v2,v3"
]

YIELDS = %W[
yield
b.yield
b.call
]

VALUES = [
nil,
0,
[],
[0],
[[]],
[[0]],
[[[]]],
[0,0],
[0,[]],
[[],0],
[[],[]]
]

WRAPBLOCKS = [
“{|*v|yield(*v)}”,
]

begin
eval “1.class {|**v| yield(**v)}”
rescue SyntaxError
WRAPBLOCKS.delete “{|**v|yield(**v)}”
end

ANONFUNCS = [
[“send(callee_name, *vs) {%s [%s] }”, “{%s}”],
[“send(callee_name, *vs, &lambda {%s [%s] })”, “&l{%s}”],
[“send(callee_name, *vs, &proc {%s [%s] })”, “&p{%s}”]
]

unless lambda{}.respond_to? :yield
YIELDS.delete(“b.yield”)
WRAPBLOCKS.reject! {|b| /b.yield/ =~ b }
end

def calleeNN(vv) YIELD(ARGS) end

def callerNN(callee_name, *vs) send(callee_name, *vs) {|ARGS| …

} end

def callerNN(callee_name, *vs) send(callee_name, *vs, &lambda

{|ARGS| … }) end

def wrapperNN(callee_name, *vs) send(callee_name, *vs) WRAPBLOCK

end

CALLEE = []
def define_callee
name = “callee00”
ARGS.each {|as|
next if !as
next if as == ‘v1,’
vars = as.scan(/v\d/)
varsb = (vars+[’&b’]).join(’,’)
YIELDS.each {|y|
name.succ!
n = name.dup
eval “def #{n}(#{varsb}) #{y}(#{as}) end”
CALLEE << [n, [vars.length, “#{y}(#{as})”]]
}
}
end
define_callee

CALLER = []
def define_caller
name = “caller00”
ANONFUNCS.each {|call_template, block_mesg|
ARGS.each {|as|
vars = as ? as.scan(/v\d/) : []
as = as ? “|#{as}|” : ‘’
name.succ!
n = name.dup
eval “def #{n}(callee_name, *vs) #{call_template % [as,
vars.join(’,’)]} end”
CALLER << [n, block_mesg % as]
}
}
end
define_caller

WRAPPER = []
def define_wrapper
name = “wrapper00”
WRAPBLOCKS.each {|w|
name.succ!
n = name.dup
w2 = w.sub(/|.*|/) { $& + “$wrapper_value = v;” }
eval “def #{n}(callee_name, *vs, &b) send(callee_name, *vs)
#{w2} end”
WRAPPER << [n, w]
}
end
define_wrapper

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

$VERBOSE = nil

def check(callee_name, callee_desc, wrapper_name, wrapper_desc,
caller_name, caller_desc, vs)
r1 = (send(caller_name, callee_name, *vs) rescue $!)
r2 = (send(caller_name, wrapper_name, callee_name, *vs) rescue $!)
wv = $wrapper_value
success = r1 == r2 || (r1.kind_of?(Exception) &&
r2.kind_of?(Exception) && r1.class == r2.class && r1.message ==
r2.message)
print(success ? “succ\t” : “fail\t”)
vs2 = vs.dup
cd = callee_desc.gsub(/v\d/) { vs2.shift.inspect }.gsub(/ /, ‘’)
wd = (wrapper_desc + ‘/’ + wv.inspect).gsub(/ /, ‘’)
r1 = r1.inspect.gsub(/ /, r1.kind_of?(Exception) ? ‘’ : ‘’)
r2 = r2.inspect.gsub(/ /, r2.kind_of?(Exception) ? '
’ : ‘’)
print cd, “\t”
print wd, “\t”
print caller_desc, “\t”
print r1, “\t”
print r2, “\n”
success
end

count = {}
error = {}
WRAPPER.each {|wrapper_name, wrapper_desc|
count[wrapper_desc] = 0
error[wrapper_desc] = 0
CALLEE.each {|callee_name, (callee_arity, callee_desc)|
perm(VALUES, callee_arity) {|vs|
CALLER.each {|caller_name, caller_desc|
count[wrapper_desc] += 1
success = check(callee_name, callee_desc, wrapper_name,
wrapper_desc, caller_name, caller_desc, vs)
error[wrapper_desc] += 1 if !success
}
}
}
puts
}

WRAPPER.each {|wrapper_name, wrapper_desc|
c = count[wrapper_desc]
e = error[wrapper_desc]
puts “#{wrapper_desc}:\t#{e}/#{c}\t#{e*100.0/c}%”
}

-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

Tanaka A. wrote:

e$B$3$N%9%l%C%I$Ne(B [ruby-dev:29078] e$B$K=P$7$?$b$N$r3H=<$7$?%9%/%je(B
e$B%W%H$r$3$N%a!<%k$K$D$1$F$^$9$N$G;n$7$F$/[email protected]$5$$!#e(Bfail e$B$,$R$He(B
e$B$D$G$b$"$l$Pe(B wrapper e$B$K$J$C$F$$$J$$$H$$$&$3$H$K$J$j$^$9!#e(B

make test [email protected]$K4X$7$F$O?.MQ$7$F$$$^$;$s!#e(B

[email protected]$K4X$7$Fe(Bmake
teste$B$r?.MQ$7$F$$$k?M$O5o$J$$$H;W$$$^$9!#$=$7$F!“e(B
make
teste$B$h$jEDCf$5$s$N$3$N%9%/%j%W%H$N$[$&$,[email protected]$,9b$$$H9M$($F$*$i$le(B
[email protected]$m$&!”$H$b;W$$$^$9!#e(B

e$B$H$$$&$o$1$GEDCf$5$s$K<ALd!"$3$N%9%/%j%W%H$rK\BN$N%F%9%H$KF~$l$k$N$rm4m0e(B
e$B$&M}M3$O$"$j$^$9$+e(B? e$B$^[email protected]$5$sH?BP$Oe(B?

e$B31$5$s$,H?BP$7$?$j$7$F!#e(B:-)

-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.5 (Cygwin)

iQEVAwUBRl47QB9L2jg5EEGlAQJfvwf+JlrQklMEZyWDd392nE/2IDrQDesQuLsH
S7lHGk+mPvwN/GmqiRhw5JAypuaL/4zo+f82wzjaAE+le2d89yF3l1jiU7s0JhmT
Qqnn1+mmIYY7BU2XMI+dt5wvzVhFQnW52VJ0p/mrmQJarpq5QfHjPU7dmoVshoao
dEA2I3CnE9g0NGW40QY7RtEgZfMGlXP1q+tpZuvRmQKeNHvLVIzxR6retQxUMQ+u
khEhwaC4UqsqmnI+wqtJNgg7F+S8XZ+7ZO+m5dgvX7P170JgXoIivn/vjUGptUlG
Vnzj+KDESoimZiT25O4VAGvb1cZb+8B+PNk93zITh2o4ZamqkGvklw==
=Dw5E
-----END PGP SIGNATURE-----

In article [email protected],
“NAKAMURA, Hiroshi” [email protected] writes:

e$B$H$$$&$o$1$GEDCf$5$s$K<ALd!"$3$N%9%/%j%W%H$rK\BN$N%F%9%H$KF~$l$k$N$rm4m0e(B
e$B$&M}M3$O$"$j$^$9$+e(B? e$B$^[email protected]$5$sH?BP$Oe(B?

e$B;~4V$,$+$+$k!"$H$$$&M}M3$,$"$j$^$9!#e(B

e$B<B9T$7$F$_$^$7$?$+e(B?

This forum is not affiliated to the Ruby language, Ruby on Rails framework, nor any Ruby applications discussed here.

| Privacy Policy | Terms of Service | Remote Ruby Jobs