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

Reply via email to