Subsections

- Exercises

# The procedure `add fan`

We are now ready to develop a procedure to add a fan to the end of the queue. Clearly, there are two different situations: an empty queue and a non-empty queue. Although we only need `tail` to extend the queue, we need `head` to determine whether the queue is empty. So here is the header:

       PROC add fan = (REF REF REF QUEUE head,tail,
                       REF FAN fan)VOID:

Firstly, we need to test whether the queue is empty:

       IF head IS nilq

Remember that the mode of `head` is `REF REF REF QUEUE`, so in the identity relation `head` is dereferenced twice.

Secondly, if the queue is empty, we assign an anonymous `REF QUEUE` to the name `head` refers to and assign `(fan,nilq)` to the `REF QUEUE`:

       THEN REF REF QUEUE(head):=
                LOC QUEUE:=(fan,nilq)

but this will not work because the scope of the `LOC QUEUE` is limited to the routine denotation. We must use a global generator:

       THEN REF REF QUEUE(head):=
                HEAP QUEUE:=(fan,nilq)

Then we have to ensure that `tail` refers to the tail of the queue:

       tail:=next OF head

If the queue is not empty, we assign an anonymous `REF` `QUEUE` to the name that `tail` points to:

       ELSE REF REF QUEUE(tail):=
                HEAP QUEUE:=(fan,nilq)

and make `tail` refer to the new tail:

       tail:=next OF tail

Here is the complete procedure:

       PROC add fan = (REF REF REF QUEUE head,tail,
                       REF FAN fan)VOID:
       IF head IS nilq
       THEN #the queue is empty#
          REF REF QUEUE(head):=
                HEAP QUEUE:=(fan,nilq);
          tail:=next OF head
       ELSE
          REF REF QUEUE(tail):=
                HEAP QUEUE:=(fan,nilq);
          tail:=next OF tail
       FI #add fan#

## Exercises

11.19
  It looks as though `add fan` could be optimised. Rewrite the body of `add` `fan` so that the overall structure is

         tail:=next OF (REF REF QUEUE
            CO IF ... FI  plus two assignments CO
                       )

  Ans
11.20
  Write a program containing the necessary declarations and loop to create a queue containing 1000 fans--alternate the names of the fans between `Iain` and `Fiona` and increment the ticket numbers by 1. Compile and run the program to check that there are no errors (no output will be produced). Ans