declare fun {NewQueue} X C={NewCell q(0 X X)} L={NewLock} proc {Insert X} N S E1 in lock L then q(N S X|E1)=@C C:=q(N+1 S E1) end end fun {Delete} N S1 E X in lock L then q(N X|S1 E)=@C C:=q(N-1 S1 E) end X end in queue(insert:Insert delete:Delete) end