[Mew-Win32 00319] Re: C-uZ
Miyashita Hisashi ( 宮下 尚:HIMI )
himi at example.com
1998年 3月 2日 (月) 13:20:08 JST
"YAMAGUCHI, Shuhei" <yamagus at example.com> writes:
> やまぐち@ねっとらぴゅたの住人、です。
>
> >>> In article <u4t1mnww1.fsf at example.com>,
> >>> Miyashita Hisashi(宮下 尚:HIMI) <himi at example.com> writes:
>
> himi> LISPはある面から見るとシンボル操作言語です。シンボルは同じObarrayに入っ
> himi> ているものなら一意性が保証されます。名前はある意味では仮に名づけられて
> himi> いるもので、(symbol-name)はシンボルそのものではありません。そういう現
> himi> 実の実体を持たないものに対して、現実の世界から手を伸ばすために(intern)
> himi> が存在すると考えるとわかりやすいと思います。
>
> どうやら、現状の私には手におえそうにないです…。 ;_;
> LISPに対する知識が絶対的に足りていません。
> せっかく説明してくださったのに、すみません。 > himiさん
ぬう、そう簡単に投げ出されると...;_;
LISPではすべての実体にはシンボル(名前?だけどnameではない)がつけられます。
厳密に言うと、シンボルなしの実体もあるのですが、すべてGCによって消されて
しまいます、し、アクセスの方法はありません。
## 本当に厳密に言うと、間接的にシンボルなしのものを保持することは
## もちろん出来ます。でも、どこかまでたどっていくと常にobarrayに入っている
## シンボルに行き着きます。GCはこれを用いているのです。
たとえば、letとかifとかcondとかsetqとかみんなシンボルです。
でも、let と "let"は違うものです。し、何ら共通点はありません。
でも、シンボルであるletを得たい時に、どうやってアクセス
するかというと(intern "let")になるわけです。
さて、シンボルは名前が同じだからといって、同じ物であるとは限りません。
同じ物かどうかを区別するにはObarrayしかありません。
(eq (intern "let" myobarray) (intern "let")) は nilになります。
違うものなのです。
(make-symbol)と、(intern)の違いはこの点にあります。
(make-symbol)は、ただ、シンボルを作るだけ。
(intern)はObarrayに突っ込んで
その中で区別をしてくれるのです。
でも、同じobarrayにつっこんだものなら、
(eq 'let (intern "let"))
同じ物になります。(通常アクセスしているシンボルのObarrayには何も
引数を与えなくて構いません。)
さて、LIPSはリーダがある文字列を読み込むとそれをシンボルに
変換しなくてはいけません。
それは、当然(intern)が行うのです。
つまり、この(intern)が遅いことは致命的な問題になります。
リーダが"let"を読み込んで、すぐに'letに変換して、その関数を
評価しなくては行けないのです。だから、この変換はとても最適化されています。
だからこそ、Message-IDからの対応をつけるには良いと考えられるのです。
from himi
Mew-win32 メーリングリストの案内