annotate base/extended-sequence.lisp @ 189:70c8d723fb8a

fix undefined *default-tempo* warning darcs-hash:20090103010419-16a00-54f1baa3eb4d382c6c533d17af89d2b7cd73bfca.gz
author j.forth <j.forth@gold.ac.uk>
date Sat, 03 Jan 2009 01:04:19 +0000
parents d1010755f507
children 545f80a73f03
rev   line source
d@33 1 (cl:in-package #:amuse)
d@33 2
d@33 3 ;; Defines a set of methods for a sequence one of whose slots is the
d@33 4 ;; real sequence (in this case a list). This allows the allocation of
d@33 5 ;; other slots for state information.
d@33 6 ;;
d@33 7 ;; Requires a lisp with extensible lists (Rhodes, User-extensible
d@33 8 ;; Sequences, 2006/7??). Currently, that means SBCL >1.0 only.
d@33 9 ;;
d@33 10 ;; The code here draws heavily on Christophe's examples
d@33 11
d@33 12 (defclass list-slot-sequence (sequence standard-object)
d@33 13 ((%data :accessor %list-slot-sequence-data
d@33 14 :initform nil)))
d@33 15
d@33 16 (defmethod sequence:length ((o list-slot-sequence))
d@33 17 (length (%list-slot-sequence-data o)))
d@33 18
d@33 19 (defmethod sequence:elt ((o list-slot-sequence) index)
d@33 20 (elt (%list-slot-sequence-data o) index))
d@33 21
d@33 22 (defmethod (setf sequence:elt) (new-value (o list-slot-sequence) index)
d@33 23 (setf (elt (%list-slot-sequence-data o) index) new-value))
d@33 24
d@33 25 (defmethod sequence:make-sequence-like ((o list-slot-sequence) length
d@33 26 &key (initial-element nil iep)
d@33 27 (initial-contents nil icp))
d@33 28 (let ((result (make-instance (class-of o))))
d@33 29 (cond
d@33 30 ((and iep icp)
d@33 31 (error "Supplied both ~S and ~S to ~S" :initial-element :initial-contents 'make-sequence-like))
d@33 32 (icp
d@33 33 (unless (= (length initial-contents) length)
d@33 34 (error "Length mismatch in ~S" 'make-sequence-like))
d@33 35 (setf (%list-slot-sequence-data result) (coerce initial-contents 'list))
d@33 36 result)
d@33 37 (t
d@33 38 (dotimes (i length result)
d@33 39 (push initial-element (%list-slot-sequence-data result)))))))
d@33 40
d@33 41 (defmethod sequence:adjust-sequence ((o list-slot-sequence) length
d@33 42 &key initial-element
d@33 43 (initial-contents nil icp))
d@33 44 (cond
d@33 45 ((= length 0)
d@33 46 (setf (%list-slot-sequence-data o) nil))
d@33 47 (icp
d@33 48 (setf (%list-slot-sequence-data o)
d@33 49 (sequence:adjust-sequence (%list-slot-sequence-data o)
d@33 50 length
d@33 51 :initial-contents initial-contents)))
d@33 52 (t (setf (%list-slot-sequence-data o)
d@33 53 (sequence:adjust-sequence (%list-slot-sequence-data o)
d@33 54 length
d@33 55 :initial-element initial-element))))
d@33 56 o)
d@33 57
d@33 58 (defmethod sequence:make-simple-sequence-iterator
d@33 59 ((o list-slot-sequence) &rest args &key from-end start end)
d@33 60 (declare (ignore from-end start end))
d@33 61 (apply #'sequence:make-simple-sequence-iterator
d@33 62 (%list-slot-sequence-data o) args))
d@33 63 (defmethod sequence:iterator-step ((o list-slot-sequence) iterator from-end)
d@33 64 (sequence:iterator-step (%list-slot-sequence-data o) iterator from-end))
d@33 65 (defmethod sequence:iterator-endp ((o list-slot-sequence) iterator limit from-end)
d@33 66 (sequence:iterator-endp (%list-slot-sequence-data o) iterator limit from-end))
d@33 67 (defmethod sequence:iterator-element ((o list-slot-sequence) iterator)
d@33 68 (sequence:iterator-element (%list-slot-sequence-data o) iterator))
d@33 69 (defmethod (setf sequence:iterator-element) (new-value (o list-slot-sequence) iterator)
d@33 70 (setf (sequence:iterator-element (%list-slot-sequence-data o) iterator) new-value))
d@33 71 (defmethod sequence:iterator-index ((o list-slot-sequence) iterator)
d@33 72 (sequence:iterator-index (%list-slot-sequence-data o) iterator))
d@33 73 (defmethod sequence:iterator-copy ((o list-slot-sequence) iterator)
d@33 74 (sequence:iterator-copy (%list-slot-sequence-data o) iterator))