Sentinel Node
The push and pop operations on a stack both have side effects on the pointer to the stack. If that pointer is a variable, we cannot write push and pop as subroutines. A common technique is to put an extra dummy node or sentinel at the front of the list; the sentinel node points to the actual list. Then we can write subroutines:
public static Cons
pushb (Cons sentinel, Object item) {
setrest(sentinel, cons(item,rest(sentinel)));
return sentinel; }
public static Object popb (Cons sentinel) {
Object item = first(rest(sentinel));
setrest(sentinel, rest(rest(sentinel)));
return item; }
(defun pushb (sentinel item)
(setf (rest sentinel)
(cons item (rest sentinel)) )
sentinel )
(defun popb (sentinel)
(let (item)
(setq item (first (rest sentinel)))
(setf (rest sentinel) (rest (rest sentinel)))
item ))