From: Yukihiro Matsumoto Date: 2006-09-09T03:04:36+09:00 Subject: [ruby-dev:29546] Re: symbol and string まつもと ゆきひろです In message "Re: [ruby-dev:29544] Re: symbol and string" on Sat, 9 Sep 2006 02:45:18 +0900, SASADA Koichi writes: |> そうですねえ。とりあえずSmalltalkではこうなってますしね。 | | Smalltalk の Hash は Dictionary でしたっけ.それが,シンボルと文字列を |同じキーとして扱う,ということでしょうか. はい。SymbolはStringのサブクラスで同じ内容のStringとSymbolは 他のクラスからは同じようにみえます。 |> ComminLispはstring-*な関数は文字列もシンボルも受け付けますね。 | | CommonLisp で Hash のような存在は何になるんでしょう. hash-tableってデータ構造があります。テストがeq, eql, equalの いずれかを指定できるようになっていて、equalの場合シンボルと 文字列を同一視するようです。 | まず,まつもとさん的には,Symbol#succ などで文字列が返るのは,問題な |い,そうあるべき,とお考えなんでしょうか.それとも,実装の都合でしょうが |なく,なんでしょうか. 実は問題ないと思っています。ただ、Symbolなら問題があると思っ ているわけでもありません。要はさして重要ではないと考えている ということですね。 |> rb_funcall(obj, '+', obj2) |> |> のようなのを全部 |> |> rb_funcall(obj, rb_intern("+"), obj2) |> |> に置き換えないといけませんねえ。 | | その例がそうなる理由はよくわかんないんですが,ID と Symbol オブジェク |トは別に考えられないでしょうか. そーですねー。 |symbol_table: | ID (C 文字列) => Symbol オブジェクト | |・rb_intern() が作るものは「消しちゃいけない」Symbolオブジェクト |・Symbol#succ などが作るものは「GC可能な」Symbolオブジェクト(GC時に |symbol_table からその値を消す) | |ことで実現できるんではないかと(GCのために,消しちゃいけないSymbolTable |を別途持ってもいいかも) | |などと考えました. | | 消しちゃいけないのは ID として利用されるものなんですから. | | ただ, | | id1 = :Sym.succ.object_id | GC.start | id2 = :Sym.succ.object_id | |で id1 == id2 であることは保証されませんが....これで困ることはあるんだ |ろうか. ないんじゃないでしょうか。それでいいのかな。 もうちょっと考えてみます。 まつもと ゆきひろ /:|)