白い箱が出るぞ


コードはこんな感じ。

(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だと思っていた。