Mercurial > hg > xemacs-beta
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 |