I may have this problem:

I have module a, which defines type A with private field a and also field v of 
type b.B And I have module b, which defines type B with private field b and 
also field w of type a.A
    
    
    # Module a:
    
    type
      A* = object
        a: int
        v: B
    
    # Module b:
    
    type
      B* = object
        b: int
        w: A
    
    
    Run

One solution is to create a third module, maybe called types, put both type 
definitions there and import that module from modules a and b.

But then module a can not access field A.a! So I have to mark field a by a * 
star to export it. But then module b can also access field a, which was not 
initially intended.

I think in Modula/Oberon recursive/mutual import was solved by separate 
definition and implementation modules if I remember correctly.

Solutions: Joining modules a and b, or including one from the other. Or using 
third module types and exporting all members.

Seems all not really nice. Modules a and b are in this case vertices and edges 
of a triangulation, in C++ generally defined in separate header files with 
mutual include.

In some languages we can just declare a type, without defining it, so that 
compiler knows it is a valid type, but I think Nim does not allow that (forward 
declaration).

Reply via email to