前回は Gauche-OLE のバグについて記事を書いたのだが、それについて興味深い情報をコメントでもらった。
理由は分からないのですが、引数のないメソッドを呼ぶときに
http://saito.hatenablog.jp/entry/2015/07/29/001905#comment-8454420450103822152
(context 'beginPath 0)
のようにダミーの引数を付けると、動くようです。
また何かOLE特有のルールがあるのでしょうか。。。
この情報を元に調査したのだが、引数の渡し方そのものには問題があるようには思われない。 しかし、あらためて REPL でひとつづつ手続きの実行をしたときに違う挙動を見付けた。
gosh> (context 'beginPath) #<ole 005ed4ac> gosh> (context 'beginPath 0) #<undef>
beginPath は値を返さないメソッドのはずなのに何やらオブジェクトを返してきている。 これで原因がわかった。 Gauche-OLE ではプロパティの参照とメソッド呼出しの区別を曖昧にしていて、それはメソッドチェインをやりやすいようにという意図があったのだが、同じ名前のプロパティとメソッドがあった場合にはプロパティの参照が優先されてしまうようだ。 無意味でも引数を与えることでこれがプロパティの参照ではなくメソッドの呼出しであることが陽に示されたことになる。
どういうわけか IE の canvas の文脈には beginPath という名前のプロパティとメソッドの両方が存在しているらしく、それが今回の問題を顕現させたという次第である。
プロパティの参照とメソッド呼出しの区別を曖昧にする案は Gauche-OLE 0.5 から導入したもので、そのときの経緯は記事にしているので参考にされたい。
http://saito.hatenablog.jp/entry/2014/09/27/173749
解決のためにはプロパティの参照とメソッド呼出しの区別をはっきりさせるしかないと思う。 メソッドチェイン構文は上手い案だと思ったのだが、区別をはっきりさせるとそのままの記法では使えなくなってしまうのが残念だ。
Document ID: 36f622cae860d60ddabb37702fc23310