Gauche:gl:repl
OpenGLで描画を続けながらREPLも走らせるには
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にセットするのがうまくいってないのかな。調査中。