Dan Eble <dan@lyric.works> writes:

> ASSIGN_EVENT_ONCE(cur, new) does this:
>
>   - if cur is nullptr: assign cur = new, return true
>   - if *cur and *new are equal: quietly return false
>   - if *cur and *new are unequal: warn and return false 
>
> Would a Scheme analog of ASSIGN_EVENT_ONCE be used like this,
>
>     (let ((my-foo-event #f))
>       ;; . . .
>       (listeners
>         ((foo-event this-engraver event)
>          (if (ly:set-event-once! my-foo-event event)
>            ;; my-foo-event event has been set: handle it
>
> or am I thinking too much like a C++ programmer?

ASSIGN_EVENT_ONCE outputs a warning, doesn't it?  A natural way of
representing this (though with a loss of choosing how to handle spurious
events) would be

       (listeners
         ((foo-event this-engraver event #:once)
           ;; event has been seen the first time: handle it

Now how this would be actually implemented: that's a different question
altogether.  make-engraver could conceivably handle this (though it
currently is a very superficial macro and would need to get smarter) by
inserting the equivalent of your code, or it could just use lambda*
instead of lambda and the generated callback could be smarter.

Yes, this is a lot of hand-waving for a simple question...

-- 
David Kastrup

Reply via email to