trouble understanding next-method and mixins
When I try the code given at the end of the e-mail I get the following
results :
Welcome to the STk interpreter version 3.99.4 [Linux-2.X-ix86]
Copyright (C) 1993-1999 Erick Gallesio - I3S - CNRS / ESSI <eg_at_unice.fr>
deleting baz #[<baz> 80970a8]
deleting mixer #[<baz> 80970a8]
deleting foo #[<baz> 80970a8]
deleting boo #[<boo> 809499c]
deleting mixer #[<boo> 809499c]
*** Error at line 41 of file ./mix.scm:
No next method when calling #[<generic> delete (4)]
with (#[<boo> 809499c]) as argument
Current eval stack:
__________________
0 (error "No next method when calling ~S\nwith ~S as argument" gf args)
1 (next-method)
2 (next-method)
The error is pretty clear. Delete<boo> is followed by delete<mixer>
which sees a next-method and dies. Obviously stk thinks there should
be yet another gf which will take <boo>, just like when <baz> was
deleted.
Although I understand the error doesn't this type of operation
severely limit the use of mixins ? After all, once I have used
<mixer> in a class, I'm stuck. I can't use it as a super class for
any other class and invoke delete on that new class or I will get the
same result that I did when trying to delete the <boo> instance. This
is all due to the next-method in delete<mixer>.
Do I need to write delete for <boo> (or <mixer>) differently somehow?
Is there some other way to invoke delete for the <mixer> super class
when deleting a <boo> object ? Do I have some larger problem in the
class designs ??
Inquiring minds want to know.
Thanks
Brian
(define-class <foo> ()
((foo :accessor foo
:init-keyword :foo)
(foo1 :accessor foo1
:initform 'foo1
:init-keyword :foo1)))
(define-class <mixer> ()
((mix :accessor mix
:init-keyword :mix
:initform 'mix)))
(define-class <baz> (<mixer> <foo>)
())
(define-class <boo> (<mixer>)
())
(define-method delete
((self <foo>))
(format #t "deleting foo ~A\n" self))
(define-method delete
((self <baz>))
(format #t "deleting baz ~A\n" self)
(next-method))
(define-method delete
((self <mixer>))
(format #t "deleting mixer ~A\n" self)
(next-method))
(define-method delete
((self <boo>))
(format #t "deleting boo ~A\n" self)
(next-method))
(define x (make <baz>))
(delete x)
(define y (make <boo>))
(delete y)
Received on Tue Jun 29 1999 - 07:55:24 CEST
This archive was generated by hypermail 2.3.0
: Mon Jul 21 2014 - 19:38:59 CEST