[iolanguage]ioを埋め込みで使ってみる

iolanguageというスクリプティング言語があり、けっこういい感じだったので、自分のプロジェクトの設定ファイル記述言語および設定言語として採用するかなーとおもっています。とりあえずは使ってみないと話にならないので、http://www.iolanguage.com/source/darcs/Io/_docs/Embedding.htmlを参考に既述してみました。

#include "IoState.h"
#include "IoDirectory.h"

IoState *state = NULL;
void simple_print(IoState *state, char *s)
{
        puts(s);
}
void simple_exception(IoState *state, IoException *e)
{
        printf("Exception: %s - %s\n",
                CSTRING(IoException_name(e)),
                CSTRING(IoException_description(e)));
}
void simple_exit(IoState *state)
{
        IoState_free(state);
        state = NULL;
        exit(0);
}
IoObject *Foo(IoObject *self, IoObject *locals, IoMessage *m)
{
        char *a = IoMessage_locals_cStringArgAt_(m, locals, 0);
        char *b = IoMessage_locals_cStringArgAt_(m, locals, 1);
        char *c = IoMessage_locals_cStringArgAt_(m, locals, 1);
        printf("arg %s %s %s\n", a, b, c);
        return IoNumber_newWithDouble_(self->tag->state, 0);
}
IoObject *Hub(IoState *state)
{
        IoSymbol *sym = IoState_symbolWithCString_(state, "config");
        IoObject *self = IoObject_new(state);
        IoObject_setSlot_to_(IoState_lobby(state), sym, self);
        return self;
}
int  main(int argc, const char *argv[])
{
        int true = 1;
        IoObject *result = NULL;
        char buf[1000];
        buf[0] = 0;
        IoObject *hub;

        state = IoState_new();
        IoState_callbackContext_(state, NULL);
        IoState_printCallback_(state, simple_print);
        IoState_exceptionCallback_(state, simple_exception);
        IoState_exitCallback_(state, simple_exit);
        hub = Hub(state);
        IoObject_addMethod_(hub,
                        IoState_symbolWithCString_(state, "addMfa"),
                        Foo);
        while (true) {
                printf(":");
                gets(buf);
                result = IoState_doCString_(state, buf);
                printf("-=> ");
                IoObject_print(result);
        }
        return 0;
}

これで、configオブジェクトが事前に用意されて、組込みメソッドのaddMfaが登録され、使えるようになります。

$ ./a
:config addMfa("1", "2", "3")
arg 1 2 2
-=> 0
:
$

なかみが無いので例としてはつまんないけれど、なかなか好いんじゃないでしょうか。