読者です 読者をやめる 読者になる 読者になる

dostring

luaにあったdostring。あれなんでなくなったんだろう?
squirrelで書くとしたらこんな感じ。

//printハンドラ
static void print( HSQUIRRELVM hvm, const SQChar* format, ... ) {
    va_list args;
    va_start( args, format );
    vprintf_s( format, args );
    va_end( args );
}
//ASCIIを1文字ずつ読み取る
static SQInteger lexer( SQUserPointer ptr ) {
    char** str = (char**)ptr;
    int cc = (*str);
    ++(*str);
    return cc;
}
//スクリプト文字列をコンパイルして実行
static bool dostring( HSQUIRRELVM hvm, const char* code ) {
    if(SQ_SUCCEEDED(sq_compile(hvm,&lexer,&code,"",false))){//コンパイル
        sq_pushroottable();//this
        return SQ_SUCCEEDED(sq_call(hvm,0,false,false));//実行
    }
    return false;
}
//テスト
int main(int,const char**)
{
    HSQUIRRELVM hvm = sq_open(1024);
    sq_setprintfunc(hvm,&print);
    
    dostring(hvm,"print(\"hoge\");");
    
    sq_close(hvm);
    return 0;
}

実行して hoge って表示されたら成功。

#define DOSTRING(CODE) dostring(hvm,#CODE)
int main(int,const char**)
{
    HSQUIRRELVM hvm = sq_open(1024);
    sq_setprintfunc(hvm,&print);
    
    DOSTRING(
    print("hoge");
    );
    
    sq_close(hvm);
    return 0;
}

マクロを使ってコードを文字列化しておくと埋め込みのスクリプトコード記述が楽になります。ぱっと見は普通のコードと変わらないのでIDEでちゃんとカラーリングされる。

この書き方でシェーダコードもcpp内に埋め込めるので適当にシェーダ試すときとかも便利。ランタイムでコンパイルされるのを気にしないでいいときはかなり使えます。