Mercurial > hg > amuse
view base/extended-sequence.lisp @ 330:2fbff655ba47 tip
Removed cpitch-adj and cents SQL columns
author | Jeremy Gow <jeremy.gow@gmail.com> |
---|---|
date | Mon, 21 Jan 2013 11:08:11 +0000 |
parents | c2e50459efab |
children |
line wrap: on
line source
(cl:in-package #:amuse) ;; Defines a set of methods for a sequence one of whose slots is the ;; real sequence (in this case a list). This allows the allocation of ;; other slots for state information. ;; ;; Requires a lisp with extensible lists (Rhodes, User-extensible ;; Sequences, 2006/7??). Currently, that means SBCL >1.0 only. ;; ;; The code here draws heavily on Christophe's examples (defclass list-slot-sequence (sequence standard-object) ((%data :accessor %list-slot-sequence-data :initarg :%data :initform nil))) (defmethod sequence:length ((o list-slot-sequence)) (length (%list-slot-sequence-data o))) (defmethod sequence:elt ((o list-slot-sequence) index) (elt (%list-slot-sequence-data o) index)) (defmethod (setf sequence:elt) (new-value (o list-slot-sequence) index) (setf (elt (%list-slot-sequence-data o) index) new-value)) (defmethod sequence:make-sequence-like ((o list-slot-sequence) length &key (initial-element nil iep) (initial-contents nil icp)) (let ((result (make-instance (class-of o)))) (cond ((and iep icp) (error "Supplied both ~S and ~S to ~S" :initial-element :initial-contents 'make-sequence-like)) (icp (unless (= (length initial-contents) length) (error "Length mismatch in ~S" 'make-sequence-like)) (setf (%list-slot-sequence-data result) (coerce initial-contents 'list)) result) (t (dotimes (i length result) (push initial-element (%list-slot-sequence-data result))))))) (defmethod sequence:adjust-sequence ((o list-slot-sequence) length &key initial-element (initial-contents nil icp)) (cond ((= length 0) (setf (%list-slot-sequence-data o) nil)) (icp (setf (%list-slot-sequence-data o) (sequence:adjust-sequence (%list-slot-sequence-data o) length :initial-contents initial-contents))) (t (setf (%list-slot-sequence-data o) (sequence:adjust-sequence (%list-slot-sequence-data o) length :initial-element initial-element)))) o) (defmethod sequence:make-simple-sequence-iterator ((o list-slot-sequence) &rest args &key from-end start end) (declare (ignore from-end start end)) (apply #'sequence:make-simple-sequence-iterator (%list-slot-sequence-data o) args)) (defmethod sequence:iterator-step ((o list-slot-sequence) iterator from-end) (sequence:iterator-step (%list-slot-sequence-data o) iterator from-end)) (defmethod sequence:iterator-endp ((o list-slot-sequence) iterator limit from-end) (sequence:iterator-endp (%list-slot-sequence-data o) iterator limit from-end)) (defmethod sequence:iterator-element ((o list-slot-sequence) iterator) (sequence:iterator-element (%list-slot-sequence-data o) iterator)) (defmethod (setf sequence:iterator-element) (new-value (o list-slot-sequence) iterator) (setf (sequence:iterator-element (%list-slot-sequence-data o) iterator) new-value)) (defmethod sequence:iterator-index ((o list-slot-sequence) iterator) (sequence:iterator-index (%list-slot-sequence-data o) iterator)) (defmethod sequence:iterator-copy ((o list-slot-sequence) iterator) (sequence:iterator-copy (%list-slot-sequence-data o) iterator))