[#14185] ruby on Linux/m68k — akira yamada / やまだあきら <akira@...>
[#14196] fork() on MacOS — nobu.nakada@...
なかだです。
[#14206] undef_method :method_missing — Kenichi Komiya <kom@...1.accsnet.ne.jp>
なかだです。
なかだです。
金光です。
むらけんです.
金光です。
金光です。
金光です。
金光です。どもっ。
むらけんです.
なかだです。
金光です。どもっ。
金光です。
金光です。FOXとかもあるのかぁ。すげぇなぁ。
まつもと ゆきひろです
金光です。御大、待ってましたっ。
なかだです。
金光です。どもどもっ。
なかだです。
さくです。
まつもと ゆきひろです
金光です。どもっ。
まつもと ゆきひろです
金光です。どもどもっ。
まつもと ゆきひろです
岩月と申します。
金光です。どもっ。
岩月と申します。
むらけんです.
楠です
むらけんです.
有馬です。
金光です。
有馬です。
金光です。どもっ。
とみたです。
金光です。
とみたです。
金光です。
まつもと ゆきひろです
金光です。(^_^;
あづみです。
有馬です。
金光です。
有馬です。
金光です。どもっ。
有馬です。
むらけんです.
むらけんさん wrote:
むらけんです.
長沢です。
まつもと ゆきひろです
金光です。どもっ。
有馬です。
金光です。どもどもっ。
むらけんです.
金光です。いちおうフォローだけ
ふなばです。
一応フォローだけ、ほんとにちょっとだけっすよ
[#14229] [BUG] segv on [str].pack("p") — Koji Arai <JCA02266@...>
新井です。
なかだです。
新井です。
なかだです。
[#14338] setup.rb (Re: Common GUI framework) — Minero Aoki <aamine@...>
あおきです。
[#14382] [BUG] segv on regex matching with long string — TAKAHASHI Masayoshi <maki@...>
高橋征義です。
[#14390] [Patch] pp.rb and debug.rb — "NAKAMURA, Hiroshi" <nakahiro@...>
なひです。
In article <DJEGJLCFNEIMKDNMLFPHCEPJCAAA.nakahiro@sarion.co.jp>,
なひです。
まつもと ゆきひろです
In article <DJEGJLCFNEIMKDNMLFPHCEPJCAAA.nakahiro@sarion.co.jp>,
あおきです。
In article <20010809221751J.aamine@mx.edit.ne.jp>,
なひです。書き忘れ。
なかだです。
nobu.nakada@nifty.ne.jpさんの
なひです。
なかだです。
In article <DJEGJLCFNEIMKDNMLFPHMEAHCBAA.nakahiro@sarion.co.jp>,
なひです。
In article <DJEGJLCFNEIMKDNMLFPHEEAICBAA.nakahiro@sarion.co.jp>,
なひです。
まつもと ゆきひろです
In article <997774251.527258.14423.nullmailer@ev.netlab.jp>,
まつもと ゆきひろです
In article <997783083.657819.14685.nullmailer@ev.netlab.jp>,
なひです。
In article <DJEGJLCFNEIMKDNMLFPHEEALCBAA.nakahiro@sarion.co.jp>,
なひです。
In article <DJEGJLCFNEIMKDNMLFPHEEAPCBAA.nakahiro@sarion.co.jp>,
なひです。
In article <DJEGJLCFNEIMKDNMLFPHMEBACBAA.nakahiro@sarion.co.jp>,
なひです。
In article <DJEGJLCFNEIMKDNMLFPHIEBBCBAA.nakahiro@sarion.co.jp>,
うぅむ。ぼーっとしてたら意味もなく Subject を変えてしまった。
In article <20010817205051.UAZHC0A8274C.C78F0C8A@mail.biglobe.ne.jp>,
あづみです。
In article <hvo66bnxe4b.fsf_-_@flux.etl.go.jp>,
古い話題で恐縮ですが…
なかだです。
In article <200109290948.f8T9mbh12942@sharui.nakada.kanuma.tochigi.jp>,
なかだです。
まつもと ゆきひろです
In article <1001945748.240863.24023.nullmailer@ev.netlab.jp>,
なかだです。
In article <200110020334.f923YLb08299@sharui.nakada.kanuma.tochigi.jp>,
なかだです。
In article <200110021010.f92AAIb13474@sharui.nakada.kanuma.tochigi.jp>,
なかだです。
まつもと ゆきひろです
まつもと ゆきひろです
なかだです。
まつもと ゆきひろです
In article <1002080461.740444.11187.nullmailer@ev.netlab.jp>,
なかだです。
まつもと ゆきひろです
なかだです。
まつもと ゆきひろです
なかだです。
まつもと ゆきひろです
あづみです。
[#14406] typo in ruby 1.7 — Koji Arai <JCA02266@...>
新井です。
[#14413] 1.7.1 2001-08-06: if true && /match/ — WATANABE Tetsuya <tetsu@...>
渡辺哲也です。
[#14465] Ruby/Bsearch — akira yamada / やまだあきら <akira@...>
まつもと ゆきひろです
At Wed, 15 Aug 2001 18:01:50 +0900,
"Akinori MUSHA" <knu@iDaemons.org> wrote:
In article <20010816001456V.satoru@namazu.org>,
Tanaka Akira <akr@m17n.org> wrote:
In article <20010816130056C.satoru@namazu.org>,
[#14480] avoid compile warning of tcltklib with VC5 — "U.Nakamura" <usa@...>
こんにちは、なかむら(う)です。
なかだです。
こんにちは、なかむら(う)です。
[#14505] BUG: ruby 1.6.4 cannot use threads on Sparc (segv) — akira yamada / やまだあきら <akira@...>
[#14530] restore terminal mode even if readline interrupted. — Koji Arai <JCA02266@...>
新井です。
新井です。
新井です。
新井です。
At Wed, 5 Sep 2001 00:19:51 +0900,
まつもと ゆきひろです
[#14552] read in IO#eof? — nobu.nakada@...
なかだです。
[#14575] infinite loop on Dir.glob("*/**/*") — nobu.nakada@...
なかだです。
[#14577] option nodynamic — Daisuke Aoki <dai@...>
青木@横浜です。
[#14595] SEGV at `$0 = "long long string"' — nobu.nakada@...
なかだです。
なかだです。
まつもと ゆきひろです
[ruby-dev:14582] Re: marshal API (was Re: [Patch] pp.rb and debug.rb)
咳といいます。
投稿しないとサボってすすまないので、やりかけのものをポストします。
> > なひは、marshalおよびunmarshalの実装は、一行も書きたくないです。
> > traverseしてdumpする/loadしてネットワークを構築するという機能は
> > Ruby本体が既に持っており、また今後も提供していくだろう機能なので、
> > そのカスタマイズ用界面(API)をうまく定義することによって、
> > custom marshal/unmarshalで流用したい。
> > custom marshal/unmarshalをする人たちで共有したい(10個あったら3000行)。
>
> すばらしいです。オブジェクト群からの情報抽出・再構成と外部フォーマット
> の定義を完全に分離しようという決意のあらわれですね。うむうむ。まったく
> もってそういうふうにモジュール化されるべきですね。
* トラバーズする層
* その結果を外部フォーマットの出力層
にわかれるんでしょうね。
機能で層がわかれるというか、情報の層がちがうのかな。
[Rubyオブジェクトのネットワーク]
|
traverser
|
[抽象化したネットワーク] → オブジェクトを再構成する情報の 列 ができる。
|
formatter
|
[任意のフォーマット]
んで、いまそういうのを書きはじめてみました。
気持ちとしては、marshal.cのw_objectがバッファを出力する代わりに、
オブジェクトを再構成する情報(BMarshal::Ref)を出力します。
フォーマッタはそれを任意の形、順序で外部フォーマットに出力できます。
とりあえず、うそSOAPっぽい出力をさせてみました。
marshal.cの出力と同じものを出すのも簡単だと思います。
---------
class BTraverser
I32 = (-2147483647-1)..2147483647
class Ref
def initialize
@klass = nil
@primary = nil
@ivars = {}
@custom_loader = false
end
attr_accessor :klass, :custom_loader
attr_reader :ivars, :primary
# primaryってヘンだな。bodyのがいいかも
def push_primary(it)
@primary = [] unless @primary
@primary.push(it)
end
end
def initialize
@map = {}
@limit = nil
@stream = []
@cur = nil
end
attr_accessor :map, :limit, :stream
# w_objectというメソッド、呼ばれてないっす。@limitも見てない
def w_object(obj)
raise(ArgError, 'exeed depth limit') if @limit == 0
case obj
when nil, true, false
@stream.push(obj)
when Fixnum
if I32 === obj
@stream.push(obj)
else
make_ref(obj)
end
else
make_ref(obj)
end
end
def make_ref(obj)
ref = @map[obj.__id__]
if ref
@stream.push ref
return ref
end
ref = Ref.new
@map[obj.__id__] = ref
@stream.push ref
begin
stack = @cur
@cur = ref
ref.klass = obj.class
if obj.respond_to? (:__load)
ref.custom_loader = true
end
obj.__dump(self)
ensure
@cur = stack
end
return ref
end
def put_class(klass)
@cur.klass = klass
end
def put_primary(v)
@cur.push_primary(v)
end
def put_ivar(n, v)
@cur.ivars[n] = v
end
def put_all_ivars(obj)
obj.instance_variables.each do |var|
value = obj.instance_eval var
@cur.ivars[var] = self.put(value)
end
end
def put(obj)
# w_object(obj)
make_ref(obj)
end
end
class Fixnum
def __dump(dumper)
dumper.put_primary(to_i)
end
end
class Object
def __dump(dumper)
dumper.put_all_ivars(self)
end
end
class Symbol
def __dump(dumper)
dumper.put_primary(self.id2name)
end
end
class Module
def __dump(dumper)
dumper.put_primary(name)
end
end
class Float
def __dump(dumper)
dumper.put_primary(to_f)
end
end
class Bignum
def __dump(dumper)
dumper.put_primary(to_i)
end
end
class String
def __dump(dumper)
dumper.put_primary(to_s)
end
end
class Regexp
def __dump(dumper)
dumper.put_primary(source)
dumper.put_primary(options)
end
end
class Array
def __dump(dumper)
self.each do |v|
dumper.put_primary(dumper.put(v))
end
end
end
class Hash
def __dump(dumper)
dumper.put_primary(dumper.put(self.default))
self.each do |k, v|
dumper.put_primary(dumper.put(k))
dumper.put_primary(dumper.put(v))
end
end
end
class Struct
def __dump(dumper)
dumper.members.each do |m|
dumper.put_primary(dumper.put(m))
dumper.put_primary(dumper.put(self[m]))
end
end
end
class Foo
def initialize(it)
@foo = self
@bar = it
end
end
class BXmlDumper
def initialize(output=[])
@cur = 1
@map = {}
@child = []
@output = output
end
attr_reader :output
def feed(obj)
return if @map[obj.id]
@map[obj.id] = @cur
@cur += 1
@child.push(obj)
end
def finish
@child.each do |r|
begin_obj(r)
primary_value(r)
ivars(r)
end_obj(r)
end
end
def dump(stream)
stream.each do |obj|
feed(obj)
end
finish
end
def put(s)
@output.push s
end
def begin_obj(r)
put %Q!<obj xsi:type="myns:#{r.klass}" id="id#{@map[r.id]}">!
end
def ivars(r)
r.ivars.each do |k, v|
name = k.sub(/^@/, '')
put %Q! <#{name} href="#id#{@map[v.id]}">!
end
end
def primary_value(r)
case r.klass.name
when 'Fixnum', 'Bignum'
put r.primary[0]
when 'Symbol'
put r.primary[0].dump
when 'String'
put r.primary[0].dump
when 'Array'
r.primary.each do |e|
put %Q! <item href="#id#{@map[e.id]}">!
end
when 'Hash'
it = r.primary[0]
put %Q! <default href="#id#{@map[it.id]}">!
ary = r.primary[1..-1]
while (ary.size > 0) do
put ' <pair>'
put %Q! <key href="#id#{@map[ary.shift.id]}">!
put %Q! <value href="#id#{@map[ary.shift.id]}">!
put ' </pair>'
end
end
end
def end_obj(r)
put '</obj>'
end
end
def test_dump(obj)
puts
p obj
puts
p Marshal.dump(obj)
puts
t = BTraverser.new
t.put(obj)
xml = BXmlDumper.new
xml.dump(t.stream)
xml.output.each do |line|
puts line
end
end
hello = Foo.new("Hello")
complex = Foo.new([:string, 2, 3, hello, :string, {hello=>:string}])
test_dump(complex)
test_dump(hello)