Thanks Alex! It makes sense now. Normally, I would use a superclass but
it's in the context of a component system so there's no inheritance (just
polymorphism).

--Kevin

On Wed, Jun 22, 2022 at 8:12 AM Alexander Burger <a...@software-lab.de>
wrote:

> Hi Kevin,
>
> > I'm wondering why this is not running as expected?
> >
> > (for @Cls '(+A +B)
> >   (run
> >     (fill
> >       '((class @Cls)
> >         (println 'define '@Cls) # prints: "define +A", then "define +B"
> >         (dm c> () (println (type This) 'default))))))
> > ..
> > (extend +B)
> > (dm c> () (println (type This) 'extended)) # prints: "c> +B redefined"
>
> It is because 'dm' stores the whole method definition as it is, i.e.
> (c> NIL (println ...)), without doing an extra copy.
>
> If later called again with another definition for the same message, it
> modifies
> the existing definition destructively.
>
> Normally this is not a problem, as the definitions are read from a source
> file
> and are thus fresh in each definition.
>
> In the above 'for' loop, the method entry (c> NIL (println ...)) is
> re-used, so
> that both classes point to the same cell. Then, when you redefine 'c>' in
> '+B'
> you also modify it in '+A' as a side effect.
>
>
> To avoid this behavior, you can call
>
>    (undef 'c> '+B)
>
> before redefining 'c>' in '+B'.
>
> Or, even better, use a common superclass which defines 'c>',
> and then override it in '+B'.
>
> ☺/ A!ex
>
> --
> UNSUBSCRIBE: mailto:picolisp@software-lab.de?subject=Unsubscribe
>

Reply via email to