オーバーロード可能?
 お久しぶりです。
 最近は就職活動などで忙しく、あまりNScripterを触れていないのですが、個人的大発見をしたのでそれを書き留めておこうかと思います。

 きっかけはsenzogawaさんの書かれたちょっとだけ言語ハック――senzogawaのNな日々でした。
 この記事の「4.getparamを切り替えることで別の引数をとるようにできる。」という項を見て、getparam命令の実装の特殊性から「頑張ったらオーバーロードできるんじゃないか?」と思い、試しに頭に浮かんだスクリプトを書いてみました。結果的にそのスクリプトはエラーが発生したのですが、それをなんとかやりくりしているうちに、実行可能なスクリプトにたどり着きました。それが以下のものです。


*define
defsub a
game

*a
getparam %0
getparam $0,%1
%0、$0、%1@
return

*start

a 1"あいう",1
end


 このスクリプトの特徴は以下の2点です。

1.getparamが2回に分けて実行されている
2.命令の呼び出し方が特殊

 本来ならgetparamを2回実行するとエラーになるのですが、a 1"あいう",1という特殊な命令の呼び出し方でそれを回避しています。
 1回目のgetparam命令ですが、内部動作的には「数字として読めるところまで読む。もし数字以外が出てきたら、今まで読んだ値を引数として渡す」といったことをしているようです。そのため、1の次に「"」(ダブルクォーテーション)を読んだところで処理を止めて、%0に1を格納していると思われます。
 そして2回目のgetparam命令ですが、この時読み出されるのは、残った「"あいう",1」の最初のダブルクォーテーションからです。ここがポイントで、普通の命令の呼び出し方だとここでは先頭に「,」が含まれて「,"あいう",1」となってしまい「いきなりコンマがきてる、引数を一つ忘れてるよ!」とNScripterは判断してエラーになってしまうわけです。

 かなり強引ですが、以上のようにすることでgetparam命令を複数回に分けて呼ぶことが可能です。今回は第一引数に数字を指定していますが、文字列を指定した場合の方がたぶん見やすいです。「a "あいう""えお"」といった呼び出し方が出来るので。とにかくポイントは「getparam命令の値の読み込みを途中で止める」ということ。その点を押さえればgetparamを3回以上に分けて呼ぶことができます。まぁ、2回呼べば十分だと思いますが。
 使い方としては、第一引数に引数の総数を指定して、引数の個数ごとに呼び出すgetparamを変える、とか。

 時間が無いのにぱぱっと書いてしまった上に見直しもしていないので突っ込みどころがありそうですが、上記スクリプトが動作することだけは確実なので、興味がある方は自分で弄ってみてください。
[PR]
by lyricist_m | 2008-10-17 19:28 | NScripter
<< 復活 getmouseoverサンプル >>