Mercurial > hg > amuse
changeset 16:5fac84ca066a
Add methods.lisp, change names for time (->timepoint) and end (cut-off)
darcs-hash:20061212123452-f76cc-aff1150ac28333922f4d9746094f987c5746facb.gz
author | David Lewis <d.lewis@gold.ac.uk> |
---|---|
date | Tue, 12 Dec 2006 12:34:52 +0000 |
parents | 38976571a4ac |
children | 930e9880ed3f |
files | generics.lisp methods.lisp |
diffstat | 2 files changed, 121 insertions(+), 5 deletions(-) [+] |
line wrap: on
line diff
--- a/generics.lisp Mon Dec 11 13:48:54 2006 +0000 +++ b/generics.lisp Tue Dec 12 12:34:52 2006 +0000 @@ -14,12 +14,12 @@ (defgeneric duration (period-designator)) (defgeneric (setf duration) (value period-designator)) -(defgeneric time (moment-designator)) -(defgeneric (setf time) (value moment-designator)) +(defgeneric timepoint (moment-designator)) +(defgeneric (setf timepoint) (value moment-designator)) (defgeneric onset (anchored-period-designator) - (:method (apd) (time apd))) + (:method (apd) (timepoint apd))) (defgeneric (setf onset) (value anchored-period-designator)) -(defgeneric end (anchored-period-designator); change name +(defgeneric cut-off (anchored-period-designator) ; name? (:method (apd) (time+ (onset apd) (duration apd)))) ;;; Coerce-type accessors @@ -35,7 +35,7 @@ (:method (pd) (make-floating-period (duration pd)))) (defgeneric moment (moment-designator) - (:method (md) (make-moment (time md)))) + (:method (md) (make-moment (timepoint md)))) ;;; Time Protocol (or moments?)
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/methods.lisp Tue Dec 12 12:34:52 2006 +0000 @@ -0,0 +1,116 @@ +(cl:in-package #:amuse) + +(defmethod duration ((period-designator period)) + (%period-interval period-designator)) + +(defmethod timepoint ((moment-designator moment)) + (%moment-time moment-designator)) + +;; Time protocol + +(defmethod time+ ((object1 moment) (object2 period)) + (make-moment (+ (timepoint object1) (duration object2)))) + +(defmethod time+ ((object1 period) (object2 moment)) ;? + (time+ object2 object1)) + +(defmethod time+ ((object1 period) (object2 period)) + (make-floating-period (+ (duration object1) + (duration object2)))) + +(defmethod time+ ((object1 moment) (object2 moment)) + (error 'undefined-action :operation 'time+ :datatype (list 'moment 'moment))) + +(defmethod time- ((object1 moment) (object2 moment)) + (make-anchored-period object1 + (- (duration object2) + (duration object1)))) + +(defmethod time- ((object1 moment) (object2 period)) + (make-moment (- (timepoint object1) (duration object2)))) + +(defmethod time- ((object1 period) (object2 moment)) ;? + (error 'undefined-action + :operation 'time- + :datatype (list 'period 'moment))) + +(defmethod time- ((object1 period) (object2 period)) + (make-floating-period (- (duration object2) + (duration object1)))) + + +(defmethod time> ((object1 moment) (object2 moment)) + (> (timepoint object1) (timepoint object2))) + +(defmethod time= ((object1 moment) (object2 moment)) + (= (timepoint object1) (timepoint object2))) + +(defmethod duration> ((object1 period) (object2 period)) + (> (duration object1) (duration object2))) + +(defmethod duration= ((object1 period) (object2 period)) + (= (duration object1) (duration object2))) + +(defmethod duration* ((object1 period) (object2 number)) + (* (duration object1) object2)) + +(defmethod duration* ((object1 number) (object2 period)) + (duration* object2 object1)) + +(defmethod duration/ ((object1 period) (object2 number)) + (/ (duration object1) object2)) + +;; Pitch protocol + +; How do we do this? + +;; Allen + +(defmethod meets ((object1 anchored-period) + (object2 anchored-period)) + (or (time= (cut-off object1) (onset object2)) + (time= (cut-off object2) (onset object1)))) + +(defmethod before ((object1 anchored-period) + (object2 anchored-period)) + (time< (cut-off object1) (onset object2))) + +(defmethod overlaps ((object1 anchored-period) + (object2 anchored-period)) + (or (and (time> (cut-off object1) (onset object2)) + (time< (onset object1) (onset object2))) + (and (time> (cut-off object1) (cut-off object2)) + (time< (onset object1) (cut-off object2))))) + +(defmethod during ((object1 anchored-period) + (object2 anchored-period)) + (and (time> (onset object1) (onset object2)) + (time< (cut-off object2) (cut-off object2)))) + +(defmethod starts ((object1 anchored-period) + (object2 anchored-period)) + (time= (onset object1) (onset object2))) + +(defmethod ends ((object1 anchored-period) + (object2 anchored-period)) + (time= (cut-off object1) (cut-off object2))) + +;; ...and + +(defmethod period-intersection ((object1 anchored-period) + (object2 anchored-period)) + (cond + ((disjoint object1 object2) + ;; if they don't overlap, return nil, not a negative-valued + ;; period + nil) + (t + (let ((new-onset (max (onset object1) + (onset object2)))) + (make-anchored-period new-onset + (time- (min (cut-off object1) + (cut-off object2)) + new-onset)))))) + + + \ No newline at end of file