artonです。

試してみましたが、うまくなかったです。
というのは、評価は複数回行なわれるからです。
例えば
<html
<head>
<script language="RubyScript">
def foo
 ..
end
def bar
 ..
end
</script>
</head>
<body>
<input type="button" onclick="foo" value="foo" language="RubyScript">
<input type="button" onclick="bar" value="bar" language="RubyScript">
</body>
</html>
の処理だと、まずHTML読み込み時にscript要素が読み込まれます。
もしscript要素を複数記述されるとその回数、パーシングの要求が来るため
その都度、評価の必要が出てきます。
それに加えて、ボタンのクリックのたびに上の例だとfooの評価を行なう必要
があるわけです。
この場合、それぞれの評価がrb_eval_string_wrap内でその度に新たなモジュ
ールでその場、その場で行なわれることになるので、あまり嬉しくないわけ
です。−書いていて気づきましたが、パーシング要求はすべてがめておいて、
イベントの度に、全部まとめて評価させるを繰り返せば良さそう−と思った
けど、やっぱりだめで、body要素のonloadイベントのように、ページの
生存期間でで1回のみ評価が必要な部分もある−ので、やはり都度評価を
せざるを得ません。というのはイベントが1回のみか複数かは不可知なので。
すると、最初に無名モジュール内でfooとbarが生まれて消えて、その後に
ボタンのクリックで既に消えた関数を呼び出すことになってしまいます。

#根本的にメインスレッドのみを使用するとさんざんインターネットを巡った
#(レベル=4)あとに、ローカルファイルをオープン(レベル=1)ということが
#出来ないので、スレッドに閉じ込める必要もあるのですが、確かにRuby本に
#あるとおり、呼び出しにくいです。というのもあって、基本的にはレベル
#1にしておいて、その時点の評価のみ4に出来ると、嬉しいですね。

−それ以前にWindows98ではIEをクラッシュさせてしまうのが謎。やっぱり
NTのほうが良いな。

Shugo Maeda wrote:
> 
> 前田です。
> 
> At Fri, 31 Mar 2000 14:30:24 +0900,
> arton <arton / geocities.co.jp> wrote:
> > 例えば、HTML上に記述されたスクリプトは信用が置けないので、
> > セキュリティレベルは4とかにしたいのですが、4にしてしまうと、
> > そもそもそのスクリプトの評価自体が、(現在はModuleのinstance_eval
> > を使用しているので)、セキュリティバイオレーションになって
> > しまいます。
> 
> Moduleのinstance_evalを使っているのは独立した名前空間を用意するた
> めだと思うのですが、代りにrb_eval_string_wrap()を使ってはいかがで
> しょうか。
> 
> rb_eval_string_wrap()を使えば無名のモジュールのコンテクストで文字
> 列(プログラム)が評価されます。
> たぶん$SAFE == 4の場合にもSecurityErrorは発生しないと思います。
> 
> --
> 前田 修吾