CSC 530 Lecture Notes Week 3, Part 2
Discussion of Assignments 1 and 2
More on Type Theory
( var-name data-value )
( function-name formal-parms function-body )
where the stack-store is further subdivided into sub-alists, one per each active function invocation.( ( state-store ) ( environment ) ( stack-store ) )
(setq x 1) (setq y 2) (defun f(y) (g)) (defun g() (+ x y))
the type binding (x int) would be put in the environment and the value binding (x 10) would be put in the state-store.(xdefvar x int 10)
Now on to Further Discussion of Type Theory
definition module Stack;
    type Stack;
    procedure Push(var s: Stack; elem: integer);
    procedure Pop(var s: Stack): integer;
    procedure Peek(s: Stack): integer;
end Stack.
implementation module Stack;
    const Size = 100;
    type Stack = array[1..Size] of integer;
    var curtop: integer;
    (* ... implementations of Push, Pop, and Peek *)
end Stack.
(* program *) module TestIntStack;
    import Stack;
    var s: Stack;
        i: integer;
begin
    Stack.Push(s, 1);
    i := Stack.Pop(s);
end TestIntStack.
wherein the module name is used to access the function, and an explicit value of the abstract type is the first actual parameter.Stack.Push(s, 1); i := Stack.Pop(s);
class Stack {
  public:
    void Push(int elem);
    int Pop();
    int Peek();
  protected:
    const int Size = 100;
    int curtop;
    int body[Size];
};
/* ... implementations of Push, Pop, and Peek */
main() {
    Stack s;
    int i;
    s.Push(1);
    i = s.Pop();
}
wherein a value (a.k.a. object) of the class type is used to access the function, which value serves also as an (implicit) actual parameter.s.Push(1); i := s.Pop();
class Stack {
  public:
    Stack();
    void push(int elem);
    void pop();
    int top();
  equations:
    pop(Stack()) = null;
    pop(s.push(e)) = s;
    top(Stack()) = null;
    top(s.push(e)) = e;
};
/* NO implementations of Push, Pop, and Peek */
main() {
    Stack s;
    int i;
    s = s.Push(1);
    i = s.Pop();
}
s = s.Push(1); i = s.Pop();
(* A generic stack module. *)
definition module Stack(Size: integer, ElemType: type);
    type Stack;
    procedure Push(var S: Stack; Elem: ElemType);
    procedure Pop(var S: Stack): ElemType:
    procedure Peek(S: Stack): ElemType;
end Stack.
implementation module Stack;
    type Stack = array[1..Size] of ElemType;
    var curtop: integer;
    (* ... implementations of Push, Pop, and Peek *)
end Stack;
(* program *) module TestIntStack;
    import Stack(100, integer);
    var S: Stack;
        i: integer;
begin
    Stack.Push(S, 1);
    i := Stack.Pop(S);
end TestIntStack;
(* program *) module TestThreeStacks;
    import Stack(100, integer) as IntStack100;
    import Stack(200, integer) as IntStack200;
    import Stack(200, real) as RealStack200;
    var SI100: IntStack100.Stack;     (* A 100-elem integer stack *)
    var SI200: IntStack200.Stack;     (* A 200-elem integer stack *)
    var SR200: RealStack200.Stack;    (* A 200-elem real stack *)
begin
    IntStack100.Push(SI100, 1);       (* push a value on SI100 *)
    IntStack200.Push(SI200, 2);       (* push a value on SI200 *)
    RealStack200.Push(SR200, 2.5);    (* push a value on SR200 *)
    (* etc. ... *)
end TestThreeStacks;