以下のプログラムを実行して
'v'を押すと「14」と表示されます。
そのまま実行しながら、myclass.nutの
inst.bar の値を3に変更して保存
'c'キーを押してコンパイルし直します。
そして、vキーを押すと「21」と表示されます。
こんな感じでビルドを挟まずにリアルタイムで反映していけると便利かな?
myclass.nut
local inst = MyClass();C++
inst._bar = 2;
printNum(inst.mul(inst._bar, 7)); // "num = 14\n"
#include "stdafx.h"
#include <sqrat.h> // squirrel.h もインクルードされる
#include <sqstdaux.h> // sqstd_seterrorhandlers
#include <stdio.h>
#include <stdarg.h>
#include <Windows.h>
// 文字列出力
static void printfunc(HSQUIRRELVM vm, const SQChar* format, ...)
{
va_list args;
va_start(args, format);
#ifdef SQUNICODE
vwprintf(format, args);
#else
vprintf(format, args);
#endif
va_end(args);
}
// クラス
class MyClass
{
public:
int mul(int x, int y) { return (x * y); }
int _bar;
};
// 関数
void printNum(int n)
{
printf("num = %d\n", n);
}
void bindMyTable(HSQUIRRELVM vm)
{
using namespace Sqrat;
// テーブルを作成
Table myTable(vm);
// MyClass オブジェクトを作成
Class<MyClass> myClass(vm);
// MyClass オブジェクトにメンバをバインド
myClass.Func(_SC("mul"), &MyClass::mul); // メンバ関数
myClass.Var(_SC("_bar"), &MyClass::_bar); // メンバ変数
// ルートテーブルに myTable を "MyTable" としてバインド
RootTable(vm).Bind(_SC("MyClass"), myClass);
RootTable(vm).Func(_SC("printNum"), &printNum);
}
// メイン
int main(int argc, char** argv)
{
// Sqratの名前空間
using namespace Sqrat;
// VMの作成
HSQUIRRELVM vm = sq_open(1024);
// エラーハンドラを設定
sqstd_seterrorhandlers(vm);
// 文字列出力関数を設定
sq_setprintfunc(vm, printfunc);
// 標準で使うVMの設定
DefaultVM::Set(vm);
bindMyTable(vm);
{
Script scriptA;
scriptA.CompileFile("myclass.nut");
while( !::GetAsyncKeyState( 'Q' ) )
{
// コンパイル
if( ::GetAsyncKeyState( 'C' ) ) scriptA.CompileFile("myclass.nut");
// 実行
// if( ::GetAsyncKeyState( 'V' ) )
scriptA.Run();
}
}
// VMを解放
sq_close(vm);
return 0;
}