On 10/19/05, Stevan Little <[EMAIL PROTECTED]> wrote:
> Darren,
>
> Your problem reminds me of the "Expression Problem", which is
> something that IIRC Luke's Theory idea was trying to solve.
Indeed, this problem is almost exactly the contravariant half of the
expression problem. Once upon a time, a theory was supposed to
represent your "role AB", but it has diverged from that. Nowadays I
think a problem like this solved by deriving from a module, which
isn't too unlike what you were showing. The "factory" abstraction
from the theory proposal solves the well-typedness of this kind of
solution.
Here's a guess:
module AB;
class A {
submethod one () {
return 'hello';
}
submethod two () {
B.four();
}
}
class B {
submethod three () {
A.one();
}
submethod four () {
return 'here';
}
}
module CD;
is AB;
class A is AB::A {
submethod one () {
return 'world';
}
}
class B is AB::B {
submethod four () {
return 'there';
}
}
This is treating all names in a module as virtual. There may be a
downside to this, in which case we could go Scala's direction and make
the distinguishing property of a role (there called "trait") that the
things it declares are virtual.
However, if you're ever deriving from a module, a somewhat uncommon
thing to do, supposedly you're doing so precisely to make the names
virtual like this. So this may just be the right solution.
Luke