[#28924] IO.popen("echo a") clear O_APPEND of other fds. — Tanaka Akira <akr@...17n.org>
以下のように、IO.popen("echo a") が関係ない他の IO の
なかだです。
[#28942] FUNC_CDECL/FUNC_STDCALL are not defined? — KIMURA Koichi <kimura.koichi@...>
木村です。
こんにちは、なかむら(う)です。
U.Nakamura wrote:
こんにちは、なかむら(う)です。
U.Nakamura wrote:
こんにちは、なかむら(う)です。
U.Nakamura wrote:
In article <44AA3F42.4060800@ttsky.net>,
Tanaka Akira wrote:
Takaaki Tateishi wrote:
卜部です。
URABE Shyouhei wrote:
Takaaki Tateishi wrote:
[#28960] 世代別 GC について — MORITA Naoyuki <mlgetter@...>
森田と申します.
[#28971] [ BUG ] $0 cannot keep the given string — Hidetoshi NAGAI <nagai@...>
永井@知能.九工大です.
[#28988] size of st_data_t — "U.Nakamura" <usa@...>
こんにちは、なかむら(う)です。
[#29006] block wrapper — Tanaka Akira <akr@...>
以前、[ruby-dev:28747] の pp.rb の問題を解決するのに
まつもと ゆきひろです
In article <1152541094.492146.23781.nullmailer@x31.priv.netlab.jp>,
まつもと ゆきひろです
In article <1152542689.441125.24418.nullmailer@x31.priv.netlab.jp>,
In article <87psgd8qb2.fsf@fsij.org>,
In article <87r70rdpeg.fsf@fsij.org>,
In article <871wshddvn.fsf@fsij.org>,
In article <87ac5g5a7i.fsf@fsij.org>,
In article <8764foo7s7.fsf@fsij.org>,
In article <87venar27i.fsf@fsij.org>,
まつもと ゆきひろです
In article <1178883053.645482.13087.nullmailer@x31.netlab.jp>,
まつもと ゆきひろです
In article <1178978140.846301.8164.nullmailer@x31.netlab.jp>,
まつもと ゆきひろです
ささだです。
In article <465E1040.7020009@atdot.net>,
まつもと ゆきひろです
In article <E1HtaMS-00041i-6U@x31>,
まつもと ゆきひろです
In article <E1HtenN-0006CM-2a@x31>,
まつもと ゆきひろです
In article <E1Htx6H-00073o-Cw@x31>,
In article <E1Hv3TT-0004LL-L8@x31>,
まつもと ゆきひろです
[#29013] problem in bignorm — "U.Nakamura" <usa@...>
こんにちは、なかむら(う)です。
まつもと ゆきひろです
こんにちは、なかむら(う)です。
こんにちは、なかむら(う)です。
こんにちは、なかむら(う)です。
まつもと ゆきひろです
こんにちは、なかむら(う)です。
まつもと ゆきひろです
[#29014] def m(a=nil, b) — Tanaka Akira <akr@...>
ふと、1.9 なら (TCPServer#initialize のように) 第一引数を省
[#29032] rational 1.12 — Tadayoshi Funaba <tadf@...>
ふなばです。
なかだです。
ふなばです。
[#29038] irb completion — Tadayoshi Funaba <tadf@...>
ふなばです。
けいじゅ@いしつかです.
まつもと ゆきひろです
けいじゅ@いしつかです.
[#29044] block parameters for class_exec,module_exec,instance_exec — Takaaki Tateishi <ttate@...>
class_exec,module_exec,instance_execのブロックパラメータの仕様について
[#29080] UNIXSocket problem with ruby 1.8.5 preview2 on cygwin — Kouhei Yanagita <yanagi@...>
柳田です。
[#29089] test_strtod(TestFloat): ArgumentError: invalid value for Float(): "0." on 1.9 — Tanaka Akira <akr@...>
2006-07-18 以来、1.9 の test-all で (他のたくさんの失敗に紛
[#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>,
まつもと ゆきひろです
In article <1153423941.406034.21948.nullmailer@x31.priv.netlab.jp>,
まつもと ゆきひろです
In article <1153425319.663162.22588.nullmailer@x31.priv.netlab.jp>,
まつもと ゆきひろです
In article <1153446431.981115.25434.nullmailer@x31.priv.netlab.jp>,
まつもと ゆきひろです
In article <1153449042.979962.26498.nullmailer@x31.priv.netlab.jp>,
まつもと ゆきひろです
In article <1153453341.450474.27973.nullmailer@x31.priv.netlab.jp>,
[#29141] テスト2 — Tadayoshi Funaba <tadf@...>
もしかするとスパムかも。
[#29148] Re: [ruby-cvs:17256] ruby, ruby: * time.c (time_to_s): generate RFC822 style date string. — WATANABE Hirofumi <eban@...>
わたなべです。
成瀬です。
まつもと ゆきひろです
卜部です
まつもと ゆきひろです
卜部です。
成瀬です。
まつもと ゆきひろです
成瀬です
まつもと ゆきひろです
成瀬です。
まつもと ゆきひろです
成瀬です。
まつもと ゆきひろです
ふなばです。
まつもと ゆきひろです
> 郵便局の消印は採用できないんですが、なにが良いと思いますか。
まつもと ゆきひろです
なかだです。
ふなばです。
[#29158] backport — "MIYAMUKO Katsuyuki" <miyamuko@...>
みやむこです。
[ruby-dev:29078] Re: block wrapper
In article <87r70rdpeg.fsf@fsij.org>,
Tanaka Akira <akr@fsij.org> writes:
> 系統的に調べる気になって、スクリプトを書いて調べて見ました。
このスクリプトが間違っていたので直して、いろいろと考えてみました。
% ~/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 の {|*v|yield(*v)} で約8% だった失敗率が 1.9 の
{|*v|yield(*v)} で約3% に下がっているので、数としては減って
います。
ただ、pp.rb の失敗のように、個々の例については以前は wrapper
になっていたものが wrapper にならなくなってしまったものもあ
りますから、単純に改善とはいえません。
というか、失敗した例を比べてみると、1.9 での失敗はすべて受け
側のブロックが {|v| ... } というひとつの変数のケースであるの
に対し、1.8 での失敗は全てそうでない ({|| ... } と変数がひと
つもないか {|v1, v2| ... } など変数が 2つ以上ある) ケースで
す。wrapper の観点から見ると、改善というよりは、うまくいかな
い仕掛けからやっぱりうまくいかない他の仕掛けに変わったという
印象です。
そして、1.9 で {|*v|yield(*v)} という wrapper がうまくいかな
い例を調べてみると、ほとんどは b.call でブロックを呼んだ場合
です。考えてみると、これは yield と call の違いを使って工夫
しようという方針から納得できます。yield と call は違うのです
から、それらを区別せずに yield で中継すればおかしなことにな
るのは想像に難くありません。
また、{|*v|b.call(*v)} を wrapper として使うと、うまくいかな
いケースはすべてが yield か b.yield でブロックを呼んだ場合で
す。これも同様に件の方針から納得できます。
ここで、興味深いのは、{|*v|yield(*v)} の場合には失敗の
「ほとんど」が b.call に関するものであるのに対し、
{|*v|b.call(*v)} の場合には失敗の「すべて」が yield と
b.yield に関するものだという違いです。
ここで疑問があるのですが、yield を 現在の 1.9 の b.call の動
作にしてしまわないのはなんででしょう?
もしそうなってくれれば、現在の ({|*v|b.call(*v)} での失敗の
原因の) yield/b.yield はなくなって、完全に動く wrapper が実
現できるのですが。
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}%"
}
--
[田中 哲][たなか あきら][Tanaka Akira]