From: Lars R. N. <lar...@gm...> - 2010-07-20 18:18:45
|
On Mon, Jul 19, 2010 at 6:37 PM, Christophe Rhodes <cs...@ca...> wrote: > > Lars Rune Nøstdal <lar...@gm...> writes: > > > Is anyone looking at > > https://bugs.launchpad.net/sbcl/+bug/492851 ? > > I'm not. If it's a problem for you, can you try following the hint in > the first comment in that report, and let us know if it works? (If you > can't, let us know how important this problem is for you and maybe > something can be worked out). > > Cheers, > > Christophe I didn't actually answer where one might use this stuff, but when handling UI events, using EQL-specialization to define callbacks is useful, for instance. As of now all widgets used in this way will never be GCed. Here is an attempt at illustrating where EQL-specialization might be useful, both of the LET forms will execute successfully and print A then B: ;;; An attempt at illustrating where EQL specialization might be useful: (defgeneric on-click (widget)) (let ((x (list "some-button-widget")) (logged-in-p nil)) (defmethod on-click ((button (eql x))) (assert logged-in-p) (write-line "B")) (defmethod on-click :before ((button (eql x))) (setf logged-in-p t) (write-line "A")) (on-click x)) ;;; ..or on both event type and target (widget): (defgeneric on-event (event widget &rest args) (:method-combination progn :most-specific-last)) (defgeneric on-click (widget &rest args)) (defmethod on-event progn (event widget &rest args) #| Forward to something that might want to use another method-combination than the "brute force" PROGN used here. |# (let* ((gf-name (intern (format nil "ON-~A" event) (symbol-package event))) (gf (and (fboundp gf-name) (symbol-function gf-name)))) (when gf (apply gf widget args)))) (let ((x (list "some-button-widget")) (logged-in-p nil)) (defmethod on-click ((widget (eql x)) &key) (assert logged-in-p) (write-line "B")) (defmethod on-click :before ((widget (eql x)) &key) (setf logged-in-p t) (write-line "A")) (defmethod on-event progn ((event (eql 'click)) (widget (eql x)) &key) (write-line "BULK OP.")) (on-event 'click x)) -- Lars Rune Nøstdal http://www.nostdal.org/ |