汎用的関数呼び出し

アバター
いわん
記事: 32
登録日時: 9年前

汎用的関数呼び出し

投稿記事 by いわん » 2年前

自作スクリプト言語でアプリケーション側の関数を呼び出す機能が概ね完成。
これでちょっとした設定変更や初期データ入力の為にわざわざ入力インタフェースを作成しなくて済む(^.^)
ただ問題がひとつ。
スクリプト実行ライブラリから関数を呼び出すとき関数の型に合わせてポインタをキャストして使用してるのだが、新しい型の関数を追加する都度その型を呼び出すコードをライブラリに追加しなければならない。
汎用的に呼び出す方法が無いものか(-ω-;)
printfみたいな可変長パラメータ形式にしても出来そうだけど、呼び出された関数側でパラメータを取り出すのが面倒そうだし・・・

・スクリプトから呼び出す関数を定義
 《アプリケーションのコード》
void foo(int a, int b)
{

}

・関数の書式と関数アドレスを登録する。
 《アプリケーションのコード》
AddUserFunc("void foo(int, int)", foo);

・スクリプトに登録した書式で関数呼び出しを記述。
 《スクリプトのコード》
foo(a, b);

・スクリプト実行時に登録した関数を書式の型にキャストしてコールする。
 《スクリプト実行ライブラリのコード》
((void (*)(int, int))pfunc)(arg[0].GetInteger(), arg[1].GetInteger());


スクリプトから画面描画関数を呼び出す実験の動画(YouTube)

アバター
usao
記事: 1889
登録日時: 12年前

Re: 汎用的関数呼び出し

投稿記事 by usao » 2年前

確か Lua は引数や戻り値を全て「スタック」というオブジェクトを使うことでやってましたね.(:「アプリケーション側」関数の型は固定される)
で,「アプリケーション側で必要な分(引数の個数)だけポップして,戻り値をプッシュしろや」という仕様だったかと.
まぁ,そういう仕組みだと当然ながらその辺の作業をアプリケーション側でやる必要があるわけですが……



なんだろう,そのあたりの面倒な作業に関するヘルパ実装みたいなのをライブラリ側で用意してやるとかすれば良いのかもしれないっすね.
(printf的なCの可変長が良いのか,C++な可変長templateみたいなのが良いのか,別の何かが良いのか,そこらへんはよくわかりませんが.)
ヘッダオンリーだったりすると扱いも楽で良さそうかも(?)

アバター
usao
記事: 1889
登録日時: 12年前

Re: 汎用的関数呼び出し

投稿記事 by usao » 2年前

> C++な可変長templateみたいなの

std::function みたいな感じのテンプレートで,
「このスタックを仕様通りに操作して,引数を解決してこの関数を呼んで,必要ならその戻り値をスタックに入れろや」
っていう実装があれば良いのかも?

アバター
いわん
記事: 32
登録日時: 9年前

Re: 汎用的関数呼び出し

投稿記事 by いわん » 2年前

関数 template が使えそうな気がしたので調べたことがあるんですが、
確か再帰的な呼び出しで可変長引数を展開していく感じでしたね。
C++ の template の仕様は感覚的に肌に合わなくてなんとなく避けていました(;^_^A
しっかり勉強してみます。