[aspectl-devel] with-special-function-scope
Pascal Costanza
pc at p-cos.net
Sun Dec 12 18:45:26 UTC 2004
Hi Peter,
Sorry for the really long delay, but I am only slowly regaining my
normal life... ;-)
On 27 Nov 2004, at 13:52, ml13 at onlinehome.de wrote:
> Hi,
>
> I am trying to extend the test example to use a special function that
> is recursive.
> As an example, I am defining f(x) to compute the sum of the squares
>> from 0 to x.
>
> When I am trying to dynamically redefining the function to simply add
> 1 to its result, this new definition seems to get called "inside" as
> well.
Yes, that's right. The methods that you add with dynamic scope are
active for the respective generic function no matter when and how you
call it. So even in a recursive call they get called as well when they
are applicable.
> What do I have to do to get the (assert (eql (f 5) 56))) working??
Special functions use the special method combination by default that
allows you to :override an existing method. This means that an
overriden method is canceled out for the current dynamic scope - i.e.,
it is never executed in the current dynamic scoped. You can make use of
this to do what you want. Here is the code:
(in-package :al-user)
(define-special-function f (x)
(:definer f*))
(defmethod f* ((scope t) x)
(if (zerop x)
0
(+ (* x x)
(f (1- x)))))
(assert (eql (f 5) 55))
(with-special-function-scope (f*)
(defmethod* f* :around ((scope dynamic) x)
(1+ (with-special-function-scope (f*)
(defmethod* f* :override :around ((scope dynamic) x)
(call-next-method))
(call-next-method))))
(assert (eql (f 5) 56)))
(assert (eql (f 6) 91))
The trick is a) to use an :around method and b) to :override that
:around method with a "skipping" method inside itself. a) is important
because if you would otherwise use a primary method there would be no
way to override just the newly added one.
(It might be a good idea to draw a diagram for the interaction in order
to understand the control flow.)
I hope this helps. Maybe you're right that this should be simpler, so I
will keep this in mind for possible future changes or additions.
> PS: By the way, is there possibly any example existing of the cached
> fibonacci function using the current version of aspectL?
I don't have any at hand at the moment, sorry. Should be simple though,
right? ;)
Cheers,
Pascal
--
Tyler: "How's that working out for you?"
Jack: "Great."
Tyler: "Keep it up, then."
More information about the Aspectl-devel
mailing list