Thanks,<br><br>Thats exactly what I needed.<br><br>Stephen<br><br>PS Here is another version <br><br><span style="font-family:courier new,monospace">#lang racket/gui</span><br style="font-family:courier new,monospace"><br style="font-family:courier new,monospace">
<span style="font-family:courier new,monospace">;;;</span><br style="font-family:courier new,monospace"><span style="font-family:courier new,monospace">;;; WORLD</span><br style="font-family:courier new,monospace"><span style="font-family:courier new,monospace">;;;</span><br style="font-family:courier new,monospace">
<br style="font-family:courier new,monospace"><span style="font-family:courier new,monospace">(define-struct world (lines))</span><br style="font-family:courier new,monospace"><span style="font-family:courier new,monospace">(define the-world </span><br style="font-family:courier new,monospace">
<span style="font-family:courier new,monospace">  (make-world  &#39;()))</span><br style="font-family:courier new,monospace"><span style="font-family:courier new,monospace">; ((0 . 0) (0 . 300) (250 . 250)) ((150 . 176) (10 . 4) (280 . 10))</span><br style="font-family:courier new,monospace">
<span style="font-family:courier new,monospace">;;;</span><br style="font-family:courier new,monospace"><span style="font-family:courier new,monospace">;;; USER LAND</span><br style="font-family:courier new,monospace"><span style="font-family:courier new,monospace">;;;</span><br style="font-family:courier new,monospace">
<br style="font-family:courier new,monospace"><span style="font-family:courier new,monospace">(define (on-mouse-event world event)</span><br style="font-family:courier new,monospace"><span style="font-family:courier new,monospace">  (let ((x (send event get-x))</span><br style="font-family:courier new,monospace">
<span style="font-family:courier new,monospace">        (y (send event get-y)))</span><br style="font-family:courier new,monospace"><span style="font-family:courier new,monospace">    (cond</span><br style="font-family:courier new,monospace">
<span style="font-family:courier new,monospace">      [(and (send event get-left-down) (send event button-changed?)) </span><br style="font-family:courier new,monospace"><span style="font-family:courier new,monospace">       (make-world (cons (cons (cons x y) &#39;()) (world-lines world)))]</span><br style="font-family:courier new,monospace">
<span style="font-family:courier new,monospace">      [(and (send event get-left-down) (send event moving?) (not (send event button-changed?)))</span><br style="font-family:courier new,monospace"><span style="font-family:courier new,monospace">       (make-world (cons (cons (cons x y) (car (world-lines world))) (cdr (world-lines world))))]</span><br style="font-family:courier new,monospace">
<span style="font-family:courier new,monospace">      [else world])))</span><br style="font-family:courier new,monospace"><br style="font-family:courier new,monospace"><span style="font-family:courier new,monospace">(define (on-paint world dc)</span><br style="font-family:courier new,monospace">
<span style="font-family:courier new,monospace">  (for-each (λ (lines) (send dc draw-lines lines))</span><br style="font-family:courier new,monospace"><span style="font-family:courier new,monospace">            (world-lines world)))</span><br style="font-family:courier new,monospace">
<br style="font-family:courier new,monospace"><span style="font-family:courier new,monospace">;;;</span><br style="font-family:courier new,monospace"><span style="font-family:courier new,monospace">;;; SYSTEM</span><br style="font-family:courier new,monospace">
<span style="font-family:courier new,monospace">;;;</span><br style="font-family:courier new,monospace"><br style="font-family:courier new,monospace"><span style="font-family:courier new,monospace">(define user:on-paint on-paint)</span><br style="font-family:courier new,monospace">
<br style="font-family:courier new,monospace"><span style="font-family:courier new,monospace">(define diagramframe (new frame% [label &quot;paint&quot;] </span><br style="font-family:courier new,monospace"><span style="font-family:courier new,monospace">                          [width 300] [height 300] </span><br style="font-family:courier new,monospace">
<span style="font-family:courier new,monospace">                          [x 1000][y 300]))</span><br style="font-family:courier new,monospace"><br style="font-family:courier new,monospace"><span style="font-family:courier new,monospace">(define paintcanvas%</span><br style="font-family:courier new,monospace">
<span style="font-family:courier new,monospace">  (class canvas%</span><br style="font-family:courier new,monospace"><span style="font-family:courier new,monospace">    (inherit get-dc refresh)</span><br style="font-family:courier new,monospace">
<span style="font-family:courier new,monospace">    (super-new)</span><br style="font-family:courier new,monospace"><span style="font-family:courier new,monospace">    (send (get-dc) set-pen &quot;red&quot; 10 &#39;solid )    </span><br style="font-family:courier new,monospace">
<span style="font-family:courier new,monospace">    (define/override (on-paint)</span><br style="font-family:courier new,monospace"><span style="font-family:courier new,monospace">      (send (get-dc) suspend-flush)</span><br style="font-family:courier new,monospace">
<span style="font-family:courier new,monospace">      (user:on-paint the-world (get-dc))</span><br style="font-family:courier new,monospace"><span style="font-family:courier new,monospace">      (send (get-dc) resume-flush))</span><br style="font-family:courier new,monospace">
<span style="font-family:courier new,monospace">    </span><br style="font-family:courier new,monospace"><span style="font-family:courier new,monospace">    (define/override (on-event mouse-event)</span><br style="font-family:courier new,monospace">
<span style="font-family:courier new,monospace">      (let* ([old-world the-world]</span><br style="font-family:courier new,monospace"><span style="font-family:courier new,monospace">             [new-world (on-mouse-event the-world mouse-event)])</span><br style="font-family:courier new,monospace">
<span style="font-family:courier new,monospace">        (if (eq? old-world new-world)</span><br style="font-family:courier new,monospace"><span style="font-family:courier new,monospace">            (super on-event mouse-event)</span><br style="font-family:courier new,monospace">
<span style="font-family:courier new,monospace">            (begin</span><br style="font-family:courier new,monospace"><span style="font-family:courier new,monospace">              (set! the-world new-world)</span><br style="font-family:courier new,monospace">
<span style="font-family:courier new,monospace">              (refresh)))))))</span><br style="font-family:courier new,monospace"><br style="font-family:courier new,monospace"><span style="font-family:courier new,monospace">(define paintcanvas (new paintcanvas% [parent diagramframe]))</span><br style="font-family:courier new,monospace">
<span style="font-family:courier new,monospace">(send diagramframe show #t)</span><br><br style="font-family:courier new,monospace"><br><br><br><div class="gmail_quote">On Mon, Apr 9, 2012 at 12:12 PM, Jens Axel Søgaard <span dir="ltr">&lt;<a href="mailto:jensaxel@soegaard.net">jensaxel@soegaard.net</a>&gt;</span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Hi Stephen,<br>
<br>
Here is how I would do it.<br>
<br>
/Jens Axel<br>
<br>
#lang racket/gui<br>
<br>
;;;<br>
;;; WORLD<br>
;;;<br>
<br>
(define-struct world (lines))<br>
(define the-world (make-world &#39;((0 . 0) (0 . 300) (250 . 250) (150 .<br>
176) (10 . 4) (280 . 10))))<br>
<br>
;;;<br>
;;; USER LAND<br>
;;;<br>
<br>
(define (on-mouse-event world event)<br>
  (if (and (send event get-left-down)<br>
           (send event moving?)<br>
           #; (send event button-changed?))<br>
      (let ((x (send event get-x))<br>
            (y (send event get-y)))<br>
        (make-world (cons (cons x y) (world-lines world))))<br>
      world))<br>
<br>
(define (on-paint world dc)<br>
  (send dc draw-lines<br>
        (map pair-&gt;point (world-lines world))))<br>
<br>
(define (pair-&gt;point p)<br>
  (make-object point% (car p) (cdr p)))<br>
<br>
<br>
;;;<br>
;;; SYSTEM<br>
;;;<br>
<br>
(define user:on-paint on-paint)<br>
<div class="im"><br>
(define diagramframe (new frame% [label &quot;paint&quot;] [width 300] [height<br>
300] [x 1000][y 300]))<br>
<br>
</div>(define paintcanvas%<br>
  (class canvas%<br>
    (inherit get-dc refresh)<br>
    (super-new)<br>
<br>
    (define/override (on-paint)<br>
      (send (get-dc) suspend-flush)<br>
      (user:on-paint the-world (get-dc))<br>
      (send (get-dc) resume-flush))<br>
<br>
    (define/override (on-event mouse-event)<br>
      (let* ([old-world the-world]<br>
             [new-world (on-mouse-event the-world mouse-event)])<br>
        (if (eq? old-world new-world)<br>
            (super on-event mouse-event)<br>
            (begin<br>
              (set! the-world new-world)<br>
              (refresh)))))))<br>
<br>
(define paintcanvas (new paintcanvas% [parent diagramframe]))<br>
(send diagramframe show #t)<br>
<br>
<br>
<br>
2012/4/9 Stephen De Gabrielle &lt;<a href="mailto:stephen.degabrielle@acm.org">stephen.degabrielle@acm.org</a>&gt;:<br>
<div><div class="h5">&gt; Hi,<br>
&gt;<br>
&gt; I thought I&#39;d try a simple GUI app using the world/universe mutation-free<br>
&gt; approach,  but trying to implement the &#39;world/universe&#39; program design<br>
&gt; myself.<br>
&gt;<br>
&gt; I&#39;ve got my little sketch below, but I quickly came to conclusion that while<br>
&gt; I could use the teachpack, I don&#39;t know how to achieve the teachpack<br>
&gt; functionality myself.<br>
&gt;<br>
&gt; I&#39;m guessing I should use continuations, but that doesn&#39;t seem to be the<br>
&gt; approach in the universe.rkt source.<br>
&gt;<br>
&gt; I could always just stuff the program into the canvas class, (as earlier<br>
&gt; games like slidey and same seem to do), but I really want to get a handle<br>
&gt; on  how to implement the &#39;world/universe&#39; style of program control.<br>
&gt;<br>
&gt; Any suggestons would be appreciated.<br>
&gt;<br>
&gt; Kind regards,<br>
&gt;<br>
&gt; Stephen<br>
&gt;<br>
&gt;<br>
&gt; ;;;;----<br>
&gt; #lang racket/gui<br>
&gt;<br>
&gt; ; simple drawing program<br>
&gt; ; mousedown starts recording a list of points<br>
&gt; ; mousechanged starts recording a new list<br>
&gt; ; paint callback paints the list of lists as lines.<br>
&gt;<br>
&gt; (define diagramframe (new frame% [label &quot;paint&quot;] [width 300] [height 300] [x<br>
&gt; 1000][y 300]))<br>
&gt;<br>
&gt; ;(define lines &#39;(((0 . 0) (0 . 300) (250 . 250) (150 . 176))))<br>
&gt; (define lines &#39;(((0 . 0) (0 . 300) (250 . 250) (150 . 176))<br>
&gt;                 ((10 . 4) (280 . 10))))<br>
&gt;<br>
&gt; (define paintcanvas%<br>
&gt;   (class canvas%<br>
&gt;     (init-field mouse-event-callback)<br>
&gt;     (super-new)<br>
&gt;     (define dc (send this get-dc))<br>
&gt;     (define/override (on-event mouse-event)<br>
&gt;       (mouse-event-callback mouse-event))))<br>
&gt;<br>
&gt; (define (paint-cb c dc)<br>
&gt;   (for-each (λ (line) (send dc draw-lines line)) lines))<br>
&gt;<br>
&gt; (define (me-cb mouse-event)<br>
&gt;   (let ((x (send mouse-event get-x))<br>
&gt;         (y (send mouse-event get-y)))<br>
&gt;     (when (and (send mouse-event get-left-down)<br>
&gt;                (send mouse-event moving?))<br>
&gt;       (if (send mouse-event button-changed?)<br>
&gt;           ; if true append as new list<br>
&gt;           &#39;()<br>
&gt;           ; if false append existing list<br>
&gt;           &#39;())))<br>
&gt;   )<br>
&gt;<br>
&gt; (define Paintcanvas (new paintcanvas%<br>
&gt;                          [parent diagramframe]<br>
&gt;                          [paint-callback paint-cb]<br>
&gt;                          [mouse-event-callback me-cb]))<br>
&gt;<br>
&gt; (define (main world)<br>
&gt;  (when world (main (??? world)))<br>
&gt;   (send diagramframe show #t))<br>
&gt;<br>
&gt; (main lines)<br>
&gt;<br>
&gt; (send diagramframe show #t)<br>
&gt;<br>
&gt; ;;-----<br>
&gt;<br>
</div></div>&gt; ____________________<br>
&gt;  Racket Users list:<br>
&gt;  <a href="http://lists.racket-lang.org/users" target="_blank">http://lists.racket-lang.org/users</a><br>
&gt;<br>
<br>
--<br>
Jens Axel Søgaard<br>
</blockquote></div><br><br clear="all"><br>-- <br><div> </div><div>--</div><div>Stephen De Gabrielle</div><div><a href="mailto:stephen.degabrielle@acm.org" target="_blank">stephen.degabrielle@acm.org</a></div><div>Telephone +44 (0)20 85670911</div>
<div>Mobile        +44 (0)79 85189045</div><div><a href="http://www.degabrielle.name/stephen" target="_blank">http://www.degabrielle.name/stephen</a></div><div>----</div><div>Professor: Oh God! I clicked without reading! </div>
<div>Cubert: And I slightly modified something I own! </div><div>Professor: We&#39;re monsters!</div><br>