source: trunk/j/src/org/armedbear/lisp/sequences.lisp @ 4688

Last change on this file since 4688 was 4688, checked in by piso, 18 years ago

Moved CONCATENATE to concatenate.lisp.

File size: 1.9 KB
Line 
1;;; sequences.lisp
2;;;
3;;; Copyright (C) 2003 Peter Graves
4;;; $Id: sequences.lisp,v 1.53 2003-11-10 00:13:04 piso Exp $
5;;;
6;;; This program is free software; you can redistribute it and/or
7;;; modify it under the terms of the GNU General Public License
8;;; as published by the Free Software Foundation; either version 2
9;;; of the License, or (at your option) any later version.
10;;;
11;;; This program is distributed in the hope that it will be useful,
12;;; but WITHOUT ANY WARRANTY; without even the implied warranty of
13;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14;;; GNU General Public License for more details.
15;;;
16;;; You should have received a copy of the GNU General Public License
17;;; along with this program; if not, write to the Free Software
18;;; Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
19
20(in-package "SYSTEM")
21
22(defmacro type-specifier-atom (type)
23  `(if (atom ,type) ,type (car ,type)))
24
25(defun make-sequence-of-type (type length)
26  (case (type-specifier-atom type)
27    (list (make-list length))
28    ((bit-vector simple-bit-vector) (make-array length :element-type 'bit))
29    (string (make-string length))
30    (vector (make-array length))
31    (t
32     (error 'type-error))))
33
34(defmacro make-sequence-like (sequence length)
35  `(make-sequence-of-type (type-of ,sequence) ,length))
36
37
38;;; SUBSEQ (from CMUCL)
39
40(defun list-subseq (sequence start &optional end)
41  (if (and end (>= start end))
42      ()
43      (let* ((groveled (nthcdr start sequence))
44       (result (list (car groveled))))
45  (if groveled
46      (do ((list (cdr groveled) (cdr list))
47     (splice result (cdr (rplacd splice (list (car list)))))
48     (index (1+ start) (1+ index)))
49              ((or (atom list) (and end (= index end)))
50               result))
51      ()))))
52
53(defun subseq (sequence start &optional end)
54  (if (listp sequence)
55      (list-subseq sequence start end)
56      (vector-subseq sequence start end)))
Note: See TracBrowser for help on using the repository browser.