Here is the canonical example of a public stack with hidden representation:
    INTERFACE Stack;
      TYPE T <: REFANY;
      PROCEDURE Create(): T;
      PROCEDURE Push(VAR s: T; x: REAL);
      PROCEDURE Pop(VAR s: T): REAL;
    END Stack.
    MODULE Stack;
      REVEAL T = BRANDED OBJECT item: REAL; link: T END;
      PROCEDURE Create(): T = BEGIN RETURN NIL END Create;
      PROCEDURE Push(VAR s: T; x: REAL) =
        BEGIN 
          s := NEW(T, item := x, link := s)
        END Push;
      PROCEDURE Pop(VAR s: T): REAL =
        VAR res: REAL;
        BEGIN 
          res := s.item; s := s.link; RETURN res
        END Pop;
    BEGIN
    END Stack.
If the representation of stacks is required in more than one module, it should be moved to a private interface, so that it can be imported wherever it is required:
    INTERFACE Stack  (* ... as before ... *) END Stack.
    INTERFACE StackRep; IMPORT Stack;   
      REVEAL Stack.T = BRANDED OBJECT item: REAL; link: Stack.T END
    END StackRep.
    MODULE Stack; IMPORT StackRep;
      (* Push, Pop, and Create as before *)
    BEGIN
    END Stack.