annotate lisp/skk/queue-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
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: queue-m.el,v 1.1 1997/12/02 08:48:36 steve Exp $
262b8bb4a523 Import from CVS: tag r20-4b8
cvs
parents:
diff changeset
2 ;;;; This file implements a simple FIFO queue 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: before 12 May 1991
262b8bb4a523 Import from CVS: tag r20-4b8
cvs
parents:
diff changeset
9 ;; Last Modified: $Date: 1997/12/02 08:48:36 $
262b8bb4a523 Import from CVS: tag r20-4b8
cvs
parents:
diff changeset
10 ;; Keywords: extensions, lisp
262b8bb4a523 Import from CVS: tag r20-4b8
cvs
parents:
diff changeset
11
262b8bb4a523 Import from CVS: tag r20-4b8
cvs
parents:
diff changeset
12 ;;;;
262b8bb4a523 Import from CVS: tag r20-4b8
cvs
parents:
diff changeset
13 ;;;; This file is part of the GNU Emacs lisp library, Elib.
262b8bb4a523 Import from CVS: tag r20-4b8
cvs
parents:
diff changeset
14 ;;;;
262b8bb4a523 Import from CVS: tag r20-4b8
cvs
parents:
diff changeset
15 ;;;; GNU Elib is free software; you can redistribute it and/or modify
262b8bb4a523 Import from CVS: tag r20-4b8
cvs
parents:
diff changeset
16 ;;;; it under the terms of the GNU General Public License as published by
262b8bb4a523 Import from CVS: tag r20-4b8
cvs
parents:
diff changeset
17 ;;;; the Free Software Foundation; either version 2, or (at your option)
262b8bb4a523 Import from CVS: tag r20-4b8
cvs
parents:
diff changeset
18 ;;;; any later version.
262b8bb4a523 Import from CVS: tag r20-4b8
cvs
parents:
diff changeset
19 ;;;;
262b8bb4a523 Import from CVS: tag r20-4b8
cvs
parents:
diff changeset
20 ;;;; GNU Elib is distributed in the hope that it will be useful,
262b8bb4a523 Import from CVS: tag r20-4b8
cvs
parents:
diff changeset
21 ;;;; but WITHOUT ANY WARRANTY; without even the implied warranty of
262b8bb4a523 Import from CVS: tag r20-4b8
cvs
parents:
diff changeset
22 ;;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
262b8bb4a523 Import from CVS: tag r20-4b8
cvs
parents:
diff changeset
23 ;;;; GNU General Public License for more details.
262b8bb4a523 Import from CVS: tag r20-4b8
cvs
parents:
diff changeset
24 ;;;;
262b8bb4a523 Import from CVS: tag r20-4b8
cvs
parents:
diff changeset
25 ;;;; You should have received a copy of the GNU General Public License
262b8bb4a523 Import from CVS: tag r20-4b8
cvs
parents:
diff changeset
26 ;;;; along with GNU Elib; see the file COPYING. If not, write to
262b8bb4a523 Import from CVS: tag r20-4b8
cvs
parents:
diff changeset
27 ;;;; the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
262b8bb4a523 Import from CVS: tag r20-4b8
cvs
parents:
diff changeset
28 ;;;; Boston, MA 02111-1307, USA
262b8bb4a523 Import from CVS: tag r20-4b8
cvs
parents:
diff changeset
29 ;;;;
262b8bb4a523 Import from CVS: tag r20-4b8
cvs
parents:
diff changeset
30 ;;;; Author: Inge Wallin
262b8bb4a523 Import from CVS: tag r20-4b8
cvs
parents:
diff changeset
31 ;;;;
262b8bb4a523 Import from CVS: tag r20-4b8
cvs
parents:
diff changeset
32
262b8bb4a523 Import from CVS: tag r20-4b8
cvs
parents:
diff changeset
33 ;;; Commentary:
262b8bb4a523 Import from CVS: tag r20-4b8
cvs
parents:
diff changeset
34
262b8bb4a523 Import from CVS: tag r20-4b8
cvs
parents:
diff changeset
35 ;;; The queue is implemented as a two cons cell list, the first
262b8bb4a523 Import from CVS: tag r20-4b8
cvs
parents:
diff changeset
36 ;;; containing the tag 'QUEUE. The car of the the second cons
262b8bb4a523 Import from CVS: tag r20-4b8
cvs
parents:
diff changeset
37 ;;; cell points at the first element of the queue and the cdr points
262b8bb4a523 Import from CVS: tag r20-4b8
cvs
parents:
diff changeset
38 ;;; at the last. All entries and removals are done using destructive
262b8bb4a523 Import from CVS: tag r20-4b8
cvs
parents:
diff changeset
39 ;;; functions.
262b8bb4a523 Import from CVS: tag r20-4b8
cvs
parents:
diff changeset
40 ;;;
262b8bb4a523 Import from CVS: tag r20-4b8
cvs
parents:
diff changeset
41 ;;; This file implements the short functions as macros for speed in
262b8bb4a523 Import from CVS: tag r20-4b8
cvs
parents:
diff changeset
42 ;;; compiled 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
262b8bb4a523 Import from CVS: tag r20-4b8
cvs
parents:
diff changeset
45
262b8bb4a523 Import from CVS: tag r20-4b8
cvs
parents:
diff changeset
46 ;;; Code:
262b8bb4a523 Import from CVS: tag r20-4b8
cvs
parents:
diff changeset
47
262b8bb4a523 Import from CVS: tag r20-4b8
cvs
parents:
diff changeset
48 ;; Provide the function version and remove the macro version
262b8bb4a523 Import from CVS: tag r20-4b8
cvs
parents:
diff changeset
49 (provide 'queue-m)
262b8bb4a523 Import from CVS: tag r20-4b8
cvs
parents:
diff changeset
50 (setq features (delq 'queue-f features))
262b8bb4a523 Import from CVS: tag r20-4b8
cvs
parents:
diff changeset
51
262b8bb4a523 Import from CVS: tag r20-4b8
cvs
parents:
diff changeset
52
262b8bb4a523 Import from CVS: tag r20-4b8
cvs
parents:
diff changeset
53 ;;; ================================================================
262b8bb4a523 Import from CVS: tag r20-4b8
cvs
parents:
diff changeset
54
262b8bb4a523 Import from CVS: tag r20-4b8
cvs
parents:
diff changeset
55
262b8bb4a523 Import from CVS: tag r20-4b8
cvs
parents:
diff changeset
56 (defmacro queue-create ()
262b8bb4a523 Import from CVS: tag r20-4b8
cvs
parents:
diff changeset
57 "Create an empty fifo queue."
262b8bb4a523 Import from CVS: tag r20-4b8
cvs
parents:
diff changeset
58 (` (cons 'QUEUE (cons nil nil))))
262b8bb4a523 Import from CVS: tag r20-4b8
cvs
parents:
diff changeset
59
262b8bb4a523 Import from CVS: tag r20-4b8
cvs
parents:
diff changeset
60
262b8bb4a523 Import from CVS: tag r20-4b8
cvs
parents:
diff changeset
61 (defmacro queue-p (queue)
262b8bb4a523 Import from CVS: tag r20-4b8
cvs
parents:
diff changeset
62 "Return t if QUEUE is a queue, otherwise return nil."
262b8bb4a523 Import from CVS: tag r20-4b8
cvs
parents:
diff changeset
63 (` (eq (car-safe (, queue)) 'QUEUE)))
262b8bb4a523 Import from CVS: tag r20-4b8
cvs
parents:
diff changeset
64
262b8bb4a523 Import from CVS: tag r20-4b8
cvs
parents:
diff changeset
65
262b8bb4a523 Import from CVS: tag r20-4b8
cvs
parents:
diff changeset
66 (defun queue-enqueue (queue element)
262b8bb4a523 Import from CVS: tag r20-4b8
cvs
parents:
diff changeset
67 "Enter an element into a queue.
262b8bb4a523 Import from CVS: tag r20-4b8
cvs
parents:
diff changeset
68 Args: QUEUE ELEMENT"
262b8bb4a523 Import from CVS: tag r20-4b8
cvs
parents:
diff changeset
69 (let ((elementcell (cons element nil)))
262b8bb4a523 Import from CVS: tag r20-4b8
cvs
parents:
diff changeset
70 (if (null (car (cdr queue)))
262b8bb4a523 Import from CVS: tag r20-4b8
cvs
parents:
diff changeset
71 ;; QUEUE is empty
262b8bb4a523 Import from CVS: tag r20-4b8
cvs
parents:
diff changeset
72 (setcar (cdr queue)
262b8bb4a523 Import from CVS: tag r20-4b8
cvs
parents:
diff changeset
73 (setcdr (cdr queue)
262b8bb4a523 Import from CVS: tag r20-4b8
cvs
parents:
diff changeset
74 elementcell))
262b8bb4a523 Import from CVS: tag r20-4b8
cvs
parents:
diff changeset
75 (setcdr (cdr (cdr queue))
262b8bb4a523 Import from CVS: tag r20-4b8
cvs
parents:
diff changeset
76 elementcell)
262b8bb4a523 Import from CVS: tag r20-4b8
cvs
parents:
diff changeset
77 (setcdr (cdr queue)
262b8bb4a523 Import from CVS: tag r20-4b8
cvs
parents:
diff changeset
78 elementcell))))
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 (defun queue-dequeue (queue)
262b8bb4a523 Import from CVS: tag r20-4b8
cvs
parents:
diff changeset
82 "Remove the first element of QUEUE and return it.
262b8bb4a523 Import from CVS: tag r20-4b8
cvs
parents:
diff changeset
83 If QUEUE is empty, return nil and do nothing."
262b8bb4a523 Import from CVS: tag r20-4b8
cvs
parents:
diff changeset
84 (if (car (cdr queue))
262b8bb4a523 Import from CVS: tag r20-4b8
cvs
parents:
diff changeset
85 (prog1
262b8bb4a523 Import from CVS: tag r20-4b8
cvs
parents:
diff changeset
86 (car (car (cdr queue)))
262b8bb4a523 Import from CVS: tag r20-4b8
cvs
parents:
diff changeset
87 (setcar (cdr queue)
262b8bb4a523 Import from CVS: tag r20-4b8
cvs
parents:
diff changeset
88 (cdr (car (cdr queue))))
262b8bb4a523 Import from CVS: tag r20-4b8
cvs
parents:
diff changeset
89 (if (null (car (cdr queue)))
262b8bb4a523 Import from CVS: tag r20-4b8
cvs
parents:
diff changeset
90 (setcdr (cdr queue) nil)))))
262b8bb4a523 Import from CVS: tag r20-4b8
cvs
parents:
diff changeset
91
262b8bb4a523 Import from CVS: tag r20-4b8
cvs
parents:
diff changeset
92
262b8bb4a523 Import from CVS: tag r20-4b8
cvs
parents:
diff changeset
93 (defmacro queue-empty (queue)
262b8bb4a523 Import from CVS: tag r20-4b8
cvs
parents:
diff changeset
94 "Return t if QUEUE is empty, otherwise return nil."
262b8bb4a523 Import from CVS: tag r20-4b8
cvs
parents:
diff changeset
95 (` (null (car (cdr (, queue))))))
262b8bb4a523 Import from CVS: tag r20-4b8
cvs
parents:
diff changeset
96
262b8bb4a523 Import from CVS: tag r20-4b8
cvs
parents:
diff changeset
97
262b8bb4a523 Import from CVS: tag r20-4b8
cvs
parents:
diff changeset
98 (defmacro queue-first (queue)
262b8bb4a523 Import from CVS: tag r20-4b8
cvs
parents:
diff changeset
99 "Return the first element of QUEUE or nil if it is empty.
262b8bb4a523 Import from CVS: tag r20-4b8
cvs
parents:
diff changeset
100 The element is not removed."
262b8bb4a523 Import from CVS: tag r20-4b8
cvs
parents:
diff changeset
101 (` (car-safe (car (cdr (, queue))))))
262b8bb4a523 Import from CVS: tag r20-4b8
cvs
parents:
diff changeset
102
262b8bb4a523 Import from CVS: tag r20-4b8
cvs
parents:
diff changeset
103
262b8bb4a523 Import from CVS: tag r20-4b8
cvs
parents:
diff changeset
104 (defmacro queue-nth (queue n)
262b8bb4a523 Import from CVS: tag r20-4b8
cvs
parents:
diff changeset
105 "Return the nth element of a queue, but don't remove it.
262b8bb4a523 Import from CVS: tag r20-4b8
cvs
parents:
diff changeset
106 Args: QUEUE N
262b8bb4a523 Import from CVS: tag r20-4b8
cvs
parents:
diff changeset
107 If the length of the queue is less than N, return nil.
262b8bb4a523 Import from CVS: tag r20-4b8
cvs
parents:
diff changeset
108
262b8bb4a523 Import from CVS: tag r20-4b8
cvs
parents:
diff changeset
109 The oldest element (the first one) has number 0."
262b8bb4a523 Import from CVS: tag r20-4b8
cvs
parents:
diff changeset
110 (` (nth (, n) (car (cdr (, queue))))))
262b8bb4a523 Import from CVS: tag r20-4b8
cvs
parents:
diff changeset
111
262b8bb4a523 Import from CVS: tag r20-4b8
cvs
parents:
diff changeset
112
262b8bb4a523 Import from CVS: tag r20-4b8
cvs
parents:
diff changeset
113 (defmacro queue-last (queue)
262b8bb4a523 Import from CVS: tag r20-4b8
cvs
parents:
diff changeset
114 "Return the last element of QUEUE or nil if it is empty."
262b8bb4a523 Import from CVS: tag r20-4b8
cvs
parents:
diff changeset
115 (` (car-safe (cdr (cdr (, queue))))))
262b8bb4a523 Import from CVS: tag r20-4b8
cvs
parents:
diff changeset
116
262b8bb4a523 Import from CVS: tag r20-4b8
cvs
parents:
diff changeset
117
262b8bb4a523 Import from CVS: tag r20-4b8
cvs
parents:
diff changeset
118 (defmacro queue-all (queue)
262b8bb4a523 Import from CVS: tag r20-4b8
cvs
parents:
diff changeset
119 "Return a list of all elements of QUEUE or nil if it is empty.
262b8bb4a523 Import from CVS: tag r20-4b8
cvs
parents:
diff changeset
120 The oldest element in the queue is the first in the list."
262b8bb4a523 Import from CVS: tag r20-4b8
cvs
parents:
diff changeset
121 (` (car (cdr (, queue)))))
262b8bb4a523 Import from CVS: tag r20-4b8
cvs
parents:
diff changeset
122
262b8bb4a523 Import from CVS: tag r20-4b8
cvs
parents:
diff changeset
123
262b8bb4a523 Import from CVS: tag r20-4b8
cvs
parents:
diff changeset
124 (defun queue-copy (queue)
262b8bb4a523 Import from CVS: tag r20-4b8
cvs
parents:
diff changeset
125 "Return a copy of QUEUE. All entries in QUEUE are also copied."
262b8bb4a523 Import from CVS: tag r20-4b8
cvs
parents:
diff changeset
126 (let* ((first (copy-sequence (car (cdr queue))))
262b8bb4a523 Import from CVS: tag r20-4b8
cvs
parents:
diff changeset
127 (last first))
262b8bb4a523 Import from CVS: tag r20-4b8
cvs
parents:
diff changeset
128 (while (cdr last)
262b8bb4a523 Import from CVS: tag r20-4b8
cvs
parents:
diff changeset
129 (setq last (cdr last)))
262b8bb4a523 Import from CVS: tag r20-4b8
cvs
parents:
diff changeset
130 (cons 'QUEUE (cons first last))))
262b8bb4a523 Import from CVS: tag r20-4b8
cvs
parents:
diff changeset
131
262b8bb4a523 Import from CVS: tag r20-4b8
cvs
parents:
diff changeset
132
262b8bb4a523 Import from CVS: tag r20-4b8
cvs
parents:
diff changeset
133 (defmacro queue-length (queue)
262b8bb4a523 Import from CVS: tag r20-4b8
cvs
parents:
diff changeset
134 "Return the number of elements in QUEUE."
262b8bb4a523 Import from CVS: tag r20-4b8
cvs
parents:
diff changeset
135 (` (length (car (cdr (, queue))))))
262b8bb4a523 Import from CVS: tag r20-4b8
cvs
parents:
diff changeset
136
262b8bb4a523 Import from CVS: tag r20-4b8
cvs
parents:
diff changeset
137
262b8bb4a523 Import from CVS: tag r20-4b8
cvs
parents:
diff changeset
138 (defmacro queue-clear (queue)
262b8bb4a523 Import from CVS: tag r20-4b8
cvs
parents:
diff changeset
139 "Remove all elements from QUEUE."
262b8bb4a523 Import from CVS: tag r20-4b8
cvs
parents:
diff changeset
140 (` (setcdr (, queue) (cons nil nil))))
262b8bb4a523 Import from CVS: tag r20-4b8
cvs
parents:
diff changeset
141
262b8bb4a523 Import from CVS: tag r20-4b8
cvs
parents:
diff changeset
142 ;;; queue-m.el ends here