annotate base/extended-sequence.lisp @ 108:b445959f4cc1

MIPS generic functions and methods for diatonic pitches Define and implement DIATONIC-PITCH-MP and DIATONIC-PITCH-CP for mips-pitches (soon to be diatonic-pitches). Supersedes MEREDITH-FOO darcs-hash:20070726131018-dc3a5-3421fb2c4beceae2370932768fefa1115050cfdd.gz
author c.rhodes <c.rhodes@gold.ac.uk>
date Thu, 26 Jul 2007 14:10:18 +0100
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))