annotate lisp/skk/stack-m.el @ 224:4663b37daab6

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