ワールド/ユニバースミューテーションフリーのアプローチを使用してシンプルなGUIアプリを試してみようと思いましたが、「ワールド/ユニバース」プログラムの設計を自分で実装しようとしています。
以下に小さなスケッチがありますが、すぐに、ティーチパックを使用することはできますが、ティーチパックの機能を自分で実現する方法がわからないという結論に達しました。
継続を使用する必要があると思いますが、それはuniverse.rktソースのアプローチではないようです。
私はいつでもプログラムをcanvasクラスに詰め込むことができましたが(slideyのような以前のゲームと同じように)、プログラム制御の「ワールド/ユニバース」スタイルを実装する方法を理解したいと思っています。
;;;;----
#lang racket/gui
; simple drawing program
; mousedown starts recording a list of points
; mousechanged starts recording a new list
; paint callback paints the list of lists as lines.
(define diagramframe (new frame% [label "paint"] [width 300]
[height 300] [x 1000][y 300]))
;(define lines '(((0 . 0) (0 . 300) (250 . 250) (150 . 176))))
(define lines '(((0 . 0) (0 . 300) (250 . 250) (150 . 176))
((10 . 4) (280 . 10))))
(define paintcanvas%
(class canvas%
(init-field mouse-event-callback)
(super-new)
(define dc (send this get-dc))
(define/override (on-event mouse-event)
(mouse-event-callback mouse-event))))
(define (paint-cb c dc)
(for-each (λ (line) (send dc draw-lines line)) lines))
(define (me-cb mouse-event)
(let ((x (send mouse-event get-x))
(y (send mouse-event get-y)))
(when (and (send mouse-event get-left-down)
(send mouse-event moving?))
(if (send mouse-event button-changed?)
; if true append as new list
'()
; if false append existing list
'()))))
(define Paintcanvas (new paintcanvas%
[parent diagramframe]
[paint-callback paint-cb]
[mouse-event-callback me-cb]))
(define (main world)
(when world (main (??? world)))
(send diagramframe show #t))
(main lines)
(send diagramframe show #t)
;;-----