ciao@diku.dk (Lars Christensen) (05/11/88)
I have a question on extended datatypes. Suppose, you want to make a stack-structure with elements of different types. You may then define the following type: TYPE StackPtr = RECORD p: POINTER TO StackPtr END; Every stackelement, should have this type as its basetype, so that the stack is build as a linked list. The stack and two types of elements may be declared like this: VAR Stack: RECORD (StackPtr) END; Ielement: POINTER TO RECORD (StackPtr) i: Integer END; Celement: POINTER TO RECORD (StackPtr) c: Char END; The operation Push is easy enough: ( Stackinitialization deleted) PROCEDURE PUSH(VAR s:StackPtr; VAR e: POINTER TO StackPtr); BEGIN e^.p:=s.p; (* e^.p is set to point to the top element *) s.p :=e (* The stack s.p is set to point to this new element *) END; It could be called with: New(Ielement); Ielement.i:=5; Push(Stack,Ielement); But when I want to Pop an element, I would like to check whether the type of the top element and the variable to return that element in are _exactly_ equal like this: PROCEDURE Pop(VAR s:StackPtr; VAR e: POINTER TO StackPtr); BEGIN IF Type(e^)<>Type(s.p^) THEN (* <-------------- *) Error('Pop of wrong type!') ELSE e:=s.p; (* e is set to point at top element on stack *) s.p:=e^.p (* s.p is set to point to the next element *) END; END; and called with: Pop(Stack,Ielement) (* OK if after the previous Push *) Pop(Stack,Celement) (* Should error if after previous Push *) But the Type() operations are not allowed. How could I implement this check with the extended type scheme given by N.Wirth? Any help would be appreciated. Lars Christensen