annotate lisp/tl/tl-list.el @ 4:b82b59fe008d r19-15b3

Import from CVS: tag r19-15b3
author cvs
date Mon, 13 Aug 2007 08:46:56 +0200
parents
children 4b173ad71786
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
4
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
1 ;;; tl-list.el --- utility functions about list
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
2
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
3 ;; Copyright (C) 1987 .. 1996 Free Software Foundation, Inc.
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
4
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
5 ;; Author: MORIOKA Tomohiko <morioka@jaist.ac.jp>
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
6 ;; Masanobu UMEDA <umerin@flab.flab.fujitsu.junet>
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
7 ;; Lars Magne Ingebrigtsen <larsi@ifi.uio.no>
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
8 ;; Version:
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
9 ;; $Id: tl-list.el,v 1.1.1.1 1996/12/18 03:55:31 steve Exp $
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
10 ;; Keywords: list
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
11
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
12 ;; This file is part of tl (Tiny Library).
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
13
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
14 ;; This program is free software; you can redistribute it and/or
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
15 ;; modify it under the terms of the GNU General Public License as
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
16 ;; published by the Free Software Foundation; either version 2, or (at
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
17 ;; your option) any later version.
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
18
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
19 ;; This program is distributed in the hope that it will be useful, but
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
20 ;; WITHOUT ANY WARRANTY; without even the implied warranty of
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
21 ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
22 ;; General Public License for more details.
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
23
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
24 ;; You should have received a copy of the GNU General Public License
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
25 ;; along with This program; see the file COPYING. If not, write to
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
26 ;; the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
27 ;; Boston, MA 02111-1307, USA.
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
28
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
29 ;;; Code:
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
30
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
31 (require 'file-detect)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
32
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
33 (cond ((file-installed-p "cl-seq.elc")
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
34 (require 'cless)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
35 )
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
36 (t
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
37 ;; New cl is not exist (Don't use old cl.el)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
38
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
39 (defun last (ls &optional n)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
40 "Returns the last element in list LS.
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
41 With optional argument N, returns Nth-to-last link (default 1).
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
42 \[tl-list.el; tomo's Common Lisp emulating function]"
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
43 (nthcdr (- (length ls) (or n 1)) ls)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
44 )
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
45
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
46 ;; imported from cl.el
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
47 (defun list* (arg &rest rest)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
48 "Return a new list with specified args as elements, cons'd to last arg.
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
49 Thus, `(list* A B C D)' is equivalent to `(nconc (list A B C) D)', or to
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
50 `(cons A (cons B (cons C D)))'."
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
51 (cond ((not rest) arg)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
52 ((not (cdr rest)) (cons arg (car rest)))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
53 (t (let* ((n (length rest))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
54 (copy (copy-sequence rest))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
55 (last (nthcdr (- n 2) copy)))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
56 (setcdr last (car (cdr last)))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
57 (cons arg copy)))))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
58
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
59 (defconst :test ':test)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
60
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
61 (defun MEMBER (elt list &rest keywords)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
62 (let ((test
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
63 (or
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
64 (let ((ret (memq ':test keywords)))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
65 (car (cdr ret))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
66 )
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
67 'eq)))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
68 (cond ((eq test 'eq)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
69 (memq elt list)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
70 )
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
71 ((eq test 'equal)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
72 (member elt list)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
73 )
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
74 (t
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
75 (catch 'tag
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
76 (while list
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
77 (let* ((cell (car list))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
78 (ret (funcall test elt cell))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
79 )
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
80 (if ret
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
81 (throw 'tag list)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
82 ))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
83 (setq list (cdr list))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
84 ))))))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
85
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
86 (defun ASSOC (key alist &rest keywords)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
87 (let ((test
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
88 (or
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
89 (let ((ret (memq ':test keywords)))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
90 (car (cdr ret))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
91 )
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
92 'eq)))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
93 (cond ((eq test 'eq)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
94 (assq key alist)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
95 )
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
96 ((eq test 'equal)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
97 (assoc key alist)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
98 )
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
99 (t
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
100 (catch 'tag
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
101 (while alist
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
102 (let* ((cell (car alist))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
103 (ret (funcall test key (car cell)))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
104 )
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
105 (if ret
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
106 (throw 'tag cell)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
107 ))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
108 (setq alist (cdr alist))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
109 ))))))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
110 ))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
111
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
112 (autoload 'compress-sorted-numbers "range")
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
113 (autoload 'expand-range "range")
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
114 (autoload 'member-of-range "range")
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
115
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
116
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
117 ;;; @ list
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
118 ;;;
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
119
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
120 (defun nnth-prev (n ls)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
121 "Modify list LS to remove elements after N th. [tl-list.el]"
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
122 (and (> n 0)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
123 (let ((cell (nthcdr (1- n) ls)))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
124 (if (consp cell)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
125 (setcdr cell nil)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
126 )
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
127 ls)))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
128
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
129 (defun nth-prev (n ls)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
130 "Return the first N elements. [tl-list.el]"
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
131 (let (dest)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
132 (while (and (> n 0) ls)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
133 (setq dest (cons (car ls) dest))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
134 (setq ls (cdr ls)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
135 n (1- n))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
136 )
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
137 (nreverse dest)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
138 ))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
139
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
140 (defun nexcept-nth (n ls)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
141 "Modify list LS to remove N th element. [tl-list.el]"
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
142 (cond ((< n 0) ls)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
143 ((= n 0) (cdr ls))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
144 (t
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
145 (let ((cell (nthcdr (1- n) ls)))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
146 (if (consp cell)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
147 (setcdr cell (cdr (cdr cell)))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
148 ))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
149 ls)))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
150
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
151 (defun except-nth (n ls)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
152 "Return elements of LS except N th. [tl-list.el]"
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
153 (if (< n 0)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
154 ls
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
155 (let (dest)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
156 (while (and (> n 0) ls)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
157 (setq dest (cons (car ls) dest))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
158 (setq ls (cdr ls)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
159 n (1- n))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
160 )
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
161 (setq ls (cdr ls))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
162 (while dest
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
163 (setq ls (cons (car dest) ls))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
164 (setq dest (cdr dest))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
165 )
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
166 ls)))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
167
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
168 (defun last-element (ls)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
169 "Return last element. [tl-list.el]"
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
170 (car (last ls))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
171 )
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
172
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
173 (defun cons-element (elt ls)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
174 "Cons ELT to LS if ELT is not nil. [tl-list.el]"
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
175 (if elt
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
176 (cons elt ls)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
177 ls))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
178
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
179 (defun cons-if (elt ls)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
180 "Cons ELT to LS if LS is not nil, otherwise return nil. [tl-list.el]"
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
181 (if ls
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
182 (cons elt ls)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
183 ))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
184
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
185 (defun append-element (ls elt)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
186 "Append ELT to last of LS if ELT is not nil. [tl-list.el]"
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
187 (if elt
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
188 (append ls (list elt))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
189 ls))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
190
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
191
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
192 ;;; @ permutation and combination
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
193 ;;;
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
194
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
195 (defun every-combination (prev &rest rest)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
196 "Every arguments are OR list,
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
197 and return list of all possible sequence. [tl-list.el]"
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
198 (if (null prev)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
199 (setq prev '(nil))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
200 )
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
201 (cond ((null rest)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
202 (mapcar 'list prev)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
203 )
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
204 (t (let (dest
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
205 (pr prev)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
206 (rest-mixed (apply 'every-combination rest))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
207 )
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
208 (while pr
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
209 (let ((rr rest-mixed))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
210 (while rr
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
211 (setq dest (cons (cons (car pr)(car rr)) dest))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
212 (setq rr (cdr rr))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
213 ))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
214 (setq pr (cdr pr))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
215 )
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
216 (nreverse dest)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
217 ))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
218 ))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
219
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
220 (defun permute (&rest ls)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
221 "Return permutation of arguments as list. [tl-list.el]"
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
222 (let ((len (length ls)))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
223 (if (<= len 1)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
224 (list ls)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
225 (let (prev
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
226 (rest ls)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
227 c dest)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
228 (while rest
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
229 (setq c (car rest))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
230 (setq rest (cdr rest))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
231 (setq dest
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
232 (nconc dest
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
233 (mapcar (function
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
234 (lambda (s)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
235 (cons c s)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
236 ))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
237 (apply (function permute)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
238 (append prev rest))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
239 )))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
240 (setq prev (nconc prev (list c)))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
241 )
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
242 dest)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
243 )))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
244
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
245
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
246 ;;; @ index
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
247 ;;;
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
248
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
249 (defun index (start end &optional inc)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
250 "Return list of numbers from START to END.
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
251 Element of the list increases by INC (default value is 1).
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
252 \[tl-list.el; ELIS compatible function]"
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
253 (or inc
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
254 (setq inc 1)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
255 )
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
256 (let ((pred (if (>= inc 0)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
257 (function <=)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
258 (function >=)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
259 ))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
260 (i start)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
261 dest)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
262 (while (funcall pred i end)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
263 (setq dest (cons i dest))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
264 (setq i (+ i inc))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
265 )
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
266 (nreverse dest)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
267 ))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
268
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
269
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
270 ;;; @ set
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
271 ;;;
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
272
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
273 (defun map-union (func ls)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
274 "Apply FUNC to each element of LS.
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
275 And return union of each result returned by FUNC. [tl-list.el]"
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
276 (let ((r ls) ret rc dest)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
277 (while r
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
278 (setq ret (funcall func (car r)))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
279 (while ret
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
280 (setq rc (car ret))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
281 (or (member rc dest)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
282 (setq dest (cons rc dest))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
283 )
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
284 (setq ret (cdr ret))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
285 )
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
286 (setq r (cdr r))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
287 )
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
288 (nreverse dest)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
289 ))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
290
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
291
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
292 ;;; @ alist
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
293 ;;;
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
294
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
295 (defun put-alist (item value alist)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
296 "Modify ALIST to set VALUE to ITEM.
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
297 If there is a pair whose car is ITEM, replace its cdr by VALUE.
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
298 If there is not such pair, create new pair (ITEM . VALUE) and
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
299 return new alist whose car is the new pair and cdr is ALIST.
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
300 \[tl-list.el; tomo's ELIS like function]"
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
301 (let ((pair (assoc item alist)))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
302 (if pair
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
303 (progn
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
304 (setcdr pair value)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
305 alist)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
306 (cons (cons item value) alist)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
307 )))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
308
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
309 (defun del-alist (item alist)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
310 "If there is a pair whose key is <ITEM>, delete it from <ALIST>.
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
311 \[tl-list.el; mol's ELIS emulating function]"
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
312 (if (equal item (car (car alist)))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
313 (cdr alist)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
314 (let ((pr alist)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
315 (r (cdr alist))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
316 )
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
317 (catch 'tag
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
318 (while (not (null r))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
319 (if (equal item (car (car r)))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
320 (progn
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
321 (rplacd pr (cdr r))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
322 (throw 'tag alist)))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
323 (setq pr r)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
324 (setq r (cdr r))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
325 )
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
326 alist))))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
327
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
328 (defun assoc-value (item alist)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
329 "Return value of <ITEM> from <ALIST>. [tl-list.el]"
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
330 (cdr (assoc item alist))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
331 )
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
332
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
333 (defun set-alist (symbol item value)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
334 "Modify a alist indicated by SYMBOL to set VALUE to ITEM. [tl-list.el]"
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
335 (or (boundp symbol)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
336 (set symbol nil)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
337 )
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
338 (set symbol (put-alist item value (symbol-value symbol)))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
339 )
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
340
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
341 (defun remove-alist (symbol item)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
342 "Remove ITEM from the alist indicated by SYMBOL. [tl-list.el]"
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
343 (and (boundp symbol)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
344 (set symbol (del-alist item (symbol-value symbol)))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
345 ))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
346
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
347 (defun modify-alist (modifier default)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
348 "Modify alist DEFAULT into alist MODIFIER. [tl-list.el]"
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
349 (mapcar (function
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
350 (lambda (as)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
351 (setq default (put-alist (car as)(cdr as) default))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
352 ))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
353 modifier)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
354 default)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
355
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
356 (defun set-modified-alist (sym modifier)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
357 "Modify a value of a symbol SYM into alist MODIFIER.
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
358 The symbol SYM should be alist. If it is not bound,
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
359 its value regard as nil. [tl-list.el]"
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
360 (if (not (boundp sym))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
361 (set sym nil)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
362 )
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
363 (set sym (modify-alist modifier (eval sym)))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
364 )
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
365
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
366
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
367 ;;; @ poly-apply
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
368 ;;;
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
369
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
370 (defun poly-funcall (functions arg)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
371 (while functions
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
372 (setq arg (funcall (car functions) arg)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
373 functions (cdr functions))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
374 )
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
375 arg)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
376
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
377
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
378 ;;; @ end
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
379 ;;;
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
380
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
381 (provide 'tl-list)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
382
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
383 (require 'tl-seq)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
384 (require 'tl-atype)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
385
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
386 ;;; tl-list.el ends here