Mercurial > hg > xemacs-beta
diff lisp/skk/stack-m.el @ 219:262b8bb4a523 r20-4b8
Import from CVS: tag r20-4b8
author | cvs |
---|---|
date | Mon, 13 Aug 2007 10:09:35 +0200 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/lisp/skk/stack-m.el Mon Aug 13 10:09:35 2007 +0200 @@ -0,0 +1,116 @@ +;;;; $Id: stack-m.el,v 1.1 1997/12/02 08:48:41 steve Exp $ +;;;; This file implements a simple LIFO stack using macros. + +;; Copyright (C) 1991-1995 Free Software Foundation + +;; Author: Inge Wallin <inge@lysator.liu.se> +;; Maintainer: elib-maintainers@lysator.liu.se +;; Created: 12 May 1991 +;; Keywords: extensions, lisp + +;;;; This file is part of the GNU Emacs lisp library, Elib. +;;;; +;;;; GNU Elib is free software; you can redistribute it and/or modify +;;;; it under the terms of the GNU General Public License as published by +;;;; the Free Software Foundation; either version 2, or (at your option) +;;;; any later version. +;;;; +;;;; GNU Elib is distributed in the hope that it will be useful, +;;;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;;;; GNU General Public License for more details. +;;;; +;;;; You should have received a copy of the GNU General Public License +;;;; along with GNU Elib; see the file COPYING. If not, write to +;;;; the Free Software Foundation, Inc., 59 Temple Place - Suite 330, +;;;; Boston, MA 02111-1307, USA +;;;; +;;;; Author: Inge Wallin +;;;; + +;;; Commentary: + +;;; The stack is implemented as a linked list with a tag 'STACK +;;; as the first element. All entries and removals are done using +;;; destructive functions. +;;; +;;; This file implements the functions as macros for speed in compiled +;;; code. +;;; + + +;;; Code: + +;; Provide the function version and remove the macro version +(provide 'stack-m) +(setq features (delq 'stack-f features)) + + +;;; ================================================================ + + +(defmacro stack-create () + "Create an empty lifo stack." + (` (cons 'STACK nil))) + + +(defmacro stack-p (stack) + "Return t if STACK is a stack, otherwise return nil." + (` (eq (car-safe (, stack)) 'STACK))) + + +(defmacro stack-push (stack element) + "Push an element onto the stack. +Args: STACK ELEMENT" + (` (setcdr (, stack) (cons (, element) (cdr (, stack)))))) + + +(defmacro stack-pop (stack) + "Remove the topmost element from STACK and return it. +If the stack is empty, return nil." + (` (prog1 + (car-safe (cdr (, stack))) + (setcdr (, stack) (cdr-safe (cdr (, stack))))))) + + +(defmacro stack-empty (stack) + "Return t if STACK is empty, otherwise return nil." + (` (null (cdr (, stack))))) + + +(defmacro stack-top (stack) + "Return the topmost element of STACK or nil if it is empty." + (` (car-safe (cdr (, stack))))) + + +(defmacro stack-nth (stack n) + "Return nth element of a stack, but don't remove it. +Args: STACK N +If the length of the stack is less than N, return nil. + +The top stack element has number 0." + (` (nth (, n) (cdr (, stack))))) + + +(defmacro stack-all (stack) + "Return a list of all entries in STACK. +The element last pushed is first in the list." + (` (cdr (, stack)))) + + +(defmacro stack-copy (stack) + "Return a copy of STACK. +All entries in STACK are also copied." + (` (cons 'STACK (copy-sequence (cdr (, stack)))))) + + +(defmacro stack-length (stack) + "Return the number of elements on STACK." + (` (length (cdr (, stack))))) + + +(defmacro stack-clear (stack) + "Remove all elements from STACK." + (` (setcdr (, stack) nil))) + +;;; stack-m.el ends here