```Search                        Top                                  Index
```
```REF STACK                                           John Gibson May 1995

>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
<<<<<<<<<<<<<<<<<<<<<                             >>>>>>>>>>>>>>>>>>>>>>
<<<<<<<<<<<<<<<<<<<<<    USER STACK PROCEDURES    >>>>>>>>>>>>>>>>>>>>>>
<<<<<<<<<<<<<<<<<<<<<                             >>>>>>>>>>>>>>>>>>>>>>
<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

In Poplog, arguments to procedures and  results from them are passed  on
the user stack, which is an  open stack of (nominally) infinite  length.
The procedures described in  this REF file enable  the user stack to  be
manipulated directly,  in  addition  to  its  implicit  use  in  passing
arguments and results.

CONTENTS - (Use <ENTER> g to access required sections)

1   Manipulating the Top Item(s)

2   Whole Stack Operations

3   Accessing the Stack as a Vector

4   Miscellaneous

-------------------------------
1  Manipulating the Top Item(s)
-------------------------------

identfn()                                                    [procedure]
The identity  procedure -- does absolutely  nothing when  called
(and so leaves the user stack untouched).

erase(item)                                                  [procedure]
Removes the top item from the user stack.

erasenum(item1, item2, ..., itemN, N)                        [procedure]
Removes the top N items from the user stack.

dup(item) -> (item, item)                                    [procedure]
Duplicates the top item on the  user stack (i.e. pushes it  back
onto the stack again).

dupnum(item, N) -> (item, item, ... item)                    [procedure]
Leaves N  copies of  item  on the  stack.  (Hence dup  could  be
defined as  dupnum(%2%)  and  erase as  dupnum(%0%).)  See  also
* dup, * applynum.

-------------------------
2  Whole Stack Operations
-------------------------

stacklength() -> N                                           [procedure]
Returns the number of items on the user stack.

setstacklength(N)                                            [procedure]
Sets the user stack length to N. If the current stacklength L is
greater than N, then  L-N items are  erased, otherwise N-L  nils
([]s) are  pushed on  (the  reason for  using  [] is  that  this
procedure is principally used by  the Lisp compiler). Note  that
for reasons of efficiency setstacklength does not check that the
argument N is an integer.

clearstack()                                                 [procedure]
Clears all items from the user stack.

----------------------------------
3  Accessing the Stack as a Vector
----------------------------------

subscr_stack(N) -> item                                      [procedure]
item -> subscr_stack(N)
This procedure allows the user stack to be used as if it were an
array: it  returns or  updates the  N-th element  on the  stack,
where the element on top of the stack (the most recently pushed)
has subscript 1.  There must be  at least N  items on the  stack
(otherwise a mishap results).

----------------
4  Miscellaneous
----------------

popstackmark -> stackmark                                     [constant]
The  value  of  this  constant  is  a  stackmark  record  (whose
conventional use is  by the  Pop-11 list  constructor to  mark a
position on the stack for * sysconslist). This item is the  only
stackmark record available to the user (although others are used
inside the system); it prints as <popstackmark>.

stackmark_key -> key                                          [constant]
The key of stackmark objects.

--- C.all/ref/stack