On 09/17/2012 02:32 PM, Kieron Hardy wrote:
Hi all,

In the following fragment, I'm trying to create a new event, queue a
callback to some handler to process that event, and then clear the event.

     (define/private (create-message)
       ...
       (set! the-event (new some-event%))
     ...
       )

     (define/private (queue-message receiver event)
       ...
           (when can-queue-message?
             (queue-callback
               (lambda () (send the-handler handle-event the-event)))
               #t)
       ...
       (set! the-event #f)
       ...
       )

However the event value that the handler actually sees is #f, i.e. the
result after the event is cleared, and not as I want a reference to the
event to process, i.e. the object resulting from the call to new.

What is the best way to get to the handler, a reference to the event it
needs to process?

Is there actually a reason to use 'set!'? Also, it's suspicious that your 'queue-message' method takes an 'event' argument but then refers to the 'the-event' field.

Here's what I would expect:

(define/private (some-method)
  ....
  (let ([the-event (new some-event%)])
    ....
    (queue-message receiver the-event)
    ....))

(define/private (queue-message receiver event)
  ....
  (when can-queue-message?
    (queue-callback
     (lambda () (send the-handler handle-event event))
     #t))
  ....)

If the method that creates the event doesn't directly call 'queue-message', I would first try to have it return the event to the method that *does* call 'queue-message', possibly using multiple values if it returns other values too.

If none of that works and you really have to use 'set!', then the solution is to save the value to a local variable that doesn't get mutated and have the callback refer to that instead of the field:

(define/private (queue-message receiver ....)
  ....
  (let ([event-to-handle the-event])
    (set! the-event #f)
    (queue-callback
     (lambda () (send the-handler handle-event event-to-handle))
     #t))
  ....)

Ryan

____________________
 Racket Users list:
 http://lists.racket-lang.org/users

Reply via email to