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.
m3-request@src.dec.com
Last modified on Mon Apr 18 13:26:15 PDT 1994 by kalsow