Shiro(2011/01/01 11:07:48 PST): glutではmain-loopを呼んだら戻ってこない。REPLを並行して走らせたい場合にどうするか。
別スレッドでread-eval-print-loopを走らせるのが一番簡単だが、0.9.1現在、 Windows版はスレッドが未サポート。
gauche.listenerはこういう時のためにあるので、試しに書いてみた。
sasagawa?(2011/01/01 18:16:09 PST): わ~~、動きました。すごい、これです、こういう動作をさせたかったんです。ChezEditが呼び出したcmd.exe経由で問題なく動いています。gl-colorの設定をdispからはずしてinitに入れておき、listenerから(gl-color 1 0 0)とやると物体の色が赤に変わります。gauche.listenerの使い方をよく読んでみます。
(use gl) (use gl.glut) (use gauche.listener) (define *spin* 0.0) (define *speed* 2.0) (define eval-handler #f) ;set by init (define (init) (gl-clear-color 0.0 0.0 0.0 0.0) (gl-shade-model GL_FLAT) (let1 listener (make <listener>) (set! eval-handler (listener-read-handler listener)) (listener-show-prompt listener)) (set! (port-buffering (current-input-port)) :none)) (define (disp) (gl-clear GL_COLOR_BUFFER_BIT) (gl-push-matrix) (gl-rotate *spin* 0.0 0.0 1.0) (gl-color '#f32(1.0 1.0 1.0)) (gl-rect '#f32(-25.0 -25.0) '#f32(25.0 25.0)) (gl-pop-matrix) (glut-swap-buffers)) (define (idle) (set! *spin* (modulo (+ *spin* *speed*) 360.0)) (when (char-ready? (current-input-port)) (eval-handler)) (glut-post-redisplay)) (define (reshape w h) (gl-viewport 0 0 w h) (gl-matrix-mode GL_PROJECTION) (gl-load-identity) (gl-ortho -50.0 50.0 -50.0 50.0 -1.0 1.0) (gl-matrix-mode GL_MODELVIEW) (gl-load-identity)) (define (keyboard key x y) (cond [(= key 27) (exit 0)])) ;ESC (define (main args) (glut-init args) (glut-init-display-mode (logior GLUT_DOUBLE GLUT_RGB)) (glut-init-window-size 250 250) (glut-init-window-position 100 100) (glut-create-window *program-name*) (init) (glut-display-func disp) (glut-reshape-func reshape) (glut-keyboard-func keyboard) (glut-idle-func idle) (glut-main-loop) 0)
ところが、EmacsからM-x shellでcmd.exeを走らせて、そこから実行すると ちゃんとreplできるんだけど、コマンドプロンプト窓やMSYS窓からだと うまくいかない。最初のchar-ready?で(何も入力してなくても) #tが帰っちゃうのが 問題っぽい。port-bufferingを:noneにセットするのがうまくいってないのかな。調査中。