comparison 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
comparison
equal deleted inserted replaced
218:c9f226976f56 219:262b8bb4a523
1 ;;;; $Id: stack-m.el,v 1.1 1997/12/02 08:48:41 steve Exp $
2 ;;;; This file implements a simple LIFO stack using macros.
3
4 ;; Copyright (C) 1991-1995 Free Software Foundation
5
6 ;; Author: Inge Wallin <inge@lysator.liu.se>
7 ;; Maintainer: elib-maintainers@lysator.liu.se
8 ;; Created: 12 May 1991
9 ;; Keywords: extensions, lisp
10
11 ;;;; This file is part of the GNU Emacs lisp library, Elib.
12 ;;;;
13 ;;;; GNU Elib is free software; you can redistribute it and/or modify
14 ;;;; it under the terms of the GNU General Public License as published by
15 ;;;; the Free Software Foundation; either version 2, or (at your option)
16 ;;;; any later version.
17 ;;;;
18 ;;;; GNU Elib is distributed in the hope that it will be useful,
19 ;;;; but WITHOUT ANY WARRANTY; without even the implied warranty of
20 ;;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
21 ;;;; GNU General Public License for more details.
22 ;;;;
23 ;;;; You should have received a copy of the GNU General Public License
24 ;;;; along with GNU Elib; see the file COPYING. If not, write to
25 ;;;; the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
26 ;;;; Boston, MA 02111-1307, USA
27 ;;;;
28 ;;;; Author: Inge Wallin
29 ;;;;
30
31 ;;; Commentary:
32
33 ;;; The stack is implemented as a linked list with a tag 'STACK
34 ;;; as the first element. All entries and removals are done using
35 ;;; destructive functions.
36 ;;;
37 ;;; This file implements the functions as macros for speed in compiled
38 ;;; code.
39 ;;;
40
41
42 ;;; Code:
43
44 ;; Provide the function version and remove the macro version
45 (provide 'stack-m)
46 (setq features (delq 'stack-f features))
47
48
49 ;;; ================================================================
50
51
52 (defmacro stack-create ()
53 "Create an empty lifo stack."
54 (` (cons 'STACK nil)))
55
56
57 (defmacro stack-p (stack)
58 "Return t if STACK is a stack, otherwise return nil."
59 (` (eq (car-safe (, stack)) 'STACK)))
60
61
62 (defmacro stack-push (stack element)
63 "Push an element onto the stack.
64 Args: STACK ELEMENT"
65 (` (setcdr (, stack) (cons (, element) (cdr (, stack))))))
66
67
68 (defmacro stack-pop (stack)
69 "Remove the topmost element from STACK and return it.
70 If the stack is empty, return nil."
71 (` (prog1
72 (car-safe (cdr (, stack)))
73 (setcdr (, stack) (cdr-safe (cdr (, stack)))))))
74
75
76 (defmacro stack-empty (stack)
77 "Return t if STACK is empty, otherwise return nil."
78 (` (null (cdr (, stack)))))
79
80
81 (defmacro stack-top (stack)
82 "Return the topmost element of STACK or nil if it is empty."
83 (` (car-safe (cdr (, stack)))))
84
85
86 (defmacro stack-nth (stack n)
87 "Return nth element of a stack, but don't remove it.
88 Args: STACK N
89 If the length of the stack is less than N, return nil.
90
91 The top stack element has number 0."
92 (` (nth (, n) (cdr (, stack)))))
93
94
95 (defmacro stack-all (stack)
96 "Return a list of all entries in STACK.
97 The element last pushed is first in the list."
98 (` (cdr (, stack))))
99
100
101 (defmacro stack-copy (stack)
102 "Return a copy of STACK.
103 All entries in STACK are also copied."
104 (` (cons 'STACK (copy-sequence (cdr (, stack))))))
105
106
107 (defmacro stack-length (stack)
108 "Return the number of elements on STACK."
109 (` (length (cdr (, stack)))))
110
111
112 (defmacro stack-clear (stack)
113 "Remove all elements from STACK."
114 (` (setcdr (, stack) nil)))
115
116 ;;; stack-m.el ends here