白い箱が出るぞ
コードはこんな感じ。
(import (rnrs) (only (mosh) symbol-value)) (define sdl-surface-screen (symbol-value '%sdl-surface-screen)) (define sdl-surface-fill (symbol-value '%sdl-surface-fill)) (define sdl-rgbsurface (symbol-value '%sdl-rgbsurface)) (define sdl-surface-blitscreen (symbol-value '%sdl-surface-blitscreen)) (define sdl-event (symbol-value '%sdl-event)) (define sdl-update (symbol-value '%sdl-update)) (let ((box (sdl-rgbsurface 20 20)) (scr (sdl-surface-screen))) (define (mainloop) (let* ((ev (sdl-event)) (event (car ev))) (cond ((eq? event 'mousemotion) (let ((x (cadr ev)) (y (caddr ev))) (sdl-surface-fill box 255 255 255 255) (sdl-surface-fill scr 0 0 0 255) (sdl-surface-blitscreen box x y) (sdl-update))) ((eq? event 'quit) (exit)) (else (display ev)(newline)))) (mainloop)) (mainloop))
手続きsdl-eventはこんな感じ。
static Object evtConvert(SDL_Event* e){ switch(e->type){ case SDL_QUIT: return Pair::list1(Symbol::intern(UC("quit"))); case SDL_MOUSEMOTION: return Pair::list4(Symbol::intern(UC("mousemotion")), Object::makeFixnum(e->motion.x), Object::makeFixnum(e->motion.y), Object::makeFixnum(e->motion.state)); default: return Pair::list1(Symbol::intern(UC("unknown-event"))); } }
つまり、これが動くということはシンボルは全VMで共通、逆に言えばシンボルテーブルを排他制御しなきゃいけないんじゃないか仮説。シンボルテーブルの実体は各VM付のnamespaceだと思っていた。