Visual guarding and predicate cleanup
This commit is contained in:
parent
71e92641f7
commit
5a67f5c53f
2 changed files with 55 additions and 10 deletions
|
|
@ -65,7 +65,7 @@
|
||||||
(record? vec2)))
|
(record? vec2)))
|
||||||
(assert (eq? (rtd-name (record-rtd vec1))
|
(assert (eq? (rtd-name (record-rtd vec1))
|
||||||
(rtd-name (record-rtd vec2))))
|
(rtd-name (record-rtd vec2))))
|
||||||
(assert (any (lambda (pred) (pred vec1)) (list vector2?)))
|
(assert ((disjoin vector2?) vec1))
|
||||||
(cond
|
(cond
|
||||||
((vector2? vec1)
|
((vector2? vec1)
|
||||||
(and (= (vector-x vec1) (vector-x vec2))
|
(and (= (vector-x vec1) (vector-x vec2))
|
||||||
|
|
@ -77,7 +77,7 @@
|
||||||
(record? vec2)))
|
(record? vec2)))
|
||||||
(assert (eq? (rtd-name (record-rtd vec1))
|
(assert (eq? (rtd-name (record-rtd vec1))
|
||||||
(rtd-name (record-rtd vec2))))
|
(rtd-name (record-rtd vec2))))
|
||||||
(assert (any (lambda (pred) (pred vec1)) (list vector2?)))
|
(assert ((disjoin vector2?) vec1))
|
||||||
(cond
|
(cond
|
||||||
((vector2? vec1)
|
((vector2? vec1)
|
||||||
(make-vector2 (+ (vector-x vec1) (vector-x vec2))
|
(make-vector2 (+ (vector-x vec1) (vector-x vec2))
|
||||||
|
|
@ -89,7 +89,7 @@
|
||||||
(record? vec2)))
|
(record? vec2)))
|
||||||
(assert (eq? (rtd-name (record-rtd vec1))
|
(assert (eq? (rtd-name (record-rtd vec1))
|
||||||
(rtd-name (record-rtd vec2))))
|
(rtd-name (record-rtd vec2))))
|
||||||
(assert (any (lambda (pred) (pred vec1)) (list vector2?)))
|
(assert ((disjoin vector2?) vec1))
|
||||||
(cond
|
(cond
|
||||||
((vector2? vec1)
|
((vector2? vec1)
|
||||||
(make-vector2 (- (vector-x vec1) (vector-x vec2))
|
(make-vector2 (- (vector-x vec1) (vector-x vec2))
|
||||||
|
|
@ -101,7 +101,7 @@
|
||||||
(record? vec2)))
|
(record? vec2)))
|
||||||
(assert (eq? (rtd-name (record-rtd vec1))
|
(assert (eq? (rtd-name (record-rtd vec1))
|
||||||
(rtd-name (record-rtd vec2))))
|
(rtd-name (record-rtd vec2))))
|
||||||
(assert (any (lambda (pred) (pred vec1)) (list vector2?)))
|
(assert ((disjoin vector2?) vec1))
|
||||||
(cond
|
(cond
|
||||||
((vector2? vec1)
|
((vector2? vec1)
|
||||||
(make-vector2 (* (vector-x vec1) (vector-x vec2))
|
(make-vector2 (* (vector-x vec1) (vector-x vec2))
|
||||||
|
|
@ -113,7 +113,7 @@
|
||||||
(record? vec2)))
|
(record? vec2)))
|
||||||
(assert (eq? (rtd-name (record-rtd vec1))
|
(assert (eq? (rtd-name (record-rtd vec1))
|
||||||
(rtd-name (record-rtd vec2))))
|
(rtd-name (record-rtd vec2))))
|
||||||
(assert (any (lambda (pred) (pred vec1)) (list vector2?)))
|
(assert ((disjoin vector2?) vec1))
|
||||||
(cond
|
(cond
|
||||||
((vector2? vec1)
|
((vector2? vec1)
|
||||||
(make-vector2 (/ (vector-x vec1) (vector-x vec2))
|
(make-vector2 (/ (vector-x vec1) (vector-x vec2))
|
||||||
|
|
@ -121,7 +121,7 @@
|
||||||
|
|
||||||
;; Magnitude
|
;; Magnitude
|
||||||
(define (vector-magnitude vec)
|
(define (vector-magnitude vec)
|
||||||
(assert (any (lambda (pred) (pred vec)) (list vector2?)))
|
(assert ((disjoin vector2?) vec))
|
||||||
(cond
|
(cond
|
||||||
((vector2? vec)
|
((vector2? vec)
|
||||||
(sqrt (+ (expt (vector-x vec) 2)
|
(sqrt (+ (expt (vector-x vec) 2)
|
||||||
|
|
@ -132,7 +132,7 @@
|
||||||
(record? vec2)))
|
(record? vec2)))
|
||||||
(assert (eq? (rtd-name (record-rtd vec1))
|
(assert (eq? (rtd-name (record-rtd vec1))
|
||||||
(rtd-name (record-rtd vec2))))
|
(rtd-name (record-rtd vec2))))
|
||||||
(assert (any (lambda (pred) (pred vec1)) (list vector2?)))
|
(assert ((disjoin vector2?) vec1))
|
||||||
(cond
|
(cond
|
||||||
((vector2? vec1)
|
((vector2? vec1)
|
||||||
(+ (* (vector-x vec1) (vector-x vec2))
|
(+ (* (vector-x vec1) (vector-x vec2))
|
||||||
|
|
@ -143,7 +143,7 @@
|
||||||
(record? vec2)))
|
(record? vec2)))
|
||||||
(assert (eq? (rtd-name (record-rtd vec1))
|
(assert (eq? (rtd-name (record-rtd vec1))
|
||||||
(rtd-name (record-rtd vec2))))
|
(rtd-name (record-rtd vec2))))
|
||||||
(assert (any (lambda (pred) (pred vec1)) (list vector2?)))
|
(assert ((disjoin vector2?) vec1))
|
||||||
(cond
|
(cond
|
||||||
((vector2? vec1)
|
((vector2? vec1)
|
||||||
(acos (/ (vector-dot vec1 vec2)
|
(acos (/ (vector-dot vec1 vec2)
|
||||||
|
|
@ -152,7 +152,7 @@
|
||||||
|
|
||||||
;; Normalization
|
;; Normalization
|
||||||
(define (vector-normalize vec)
|
(define (vector-normalize vec)
|
||||||
(assert (any (lambda (pred) (pred vec)) (list vector2?))) ;; TODO: This assertion should be moved out of here
|
(assert ((disjoin vector2?) vec)) ;; TODO: This assertion should be moved out of here
|
||||||
(let ((magnitude (vector-magnitude vec)))
|
(let ((magnitude (vector-magnitude vec)))
|
||||||
(cond
|
(cond
|
||||||
((vector2? vec)
|
((vector2? vec)
|
||||||
|
|
@ -310,6 +310,13 @@
|
||||||
pixel-2d?
|
pixel-2d?
|
||||||
(position pixel-2d-position int:set-pixel-2d-position!))
|
(position pixel-2d-position int:set-pixel-2d-position!))
|
||||||
|
|
||||||
|
(define (make-pixel-2d position)
|
||||||
|
(assert (vector2? position))
|
||||||
|
(int:make-pixel-2d position))
|
||||||
|
|
||||||
|
(define set-pixel-2d-position!
|
||||||
|
(guarded-mutator pixel-2d? 'position vector2?))
|
||||||
|
|
||||||
(define-record-type <line-2d>
|
(define-record-type <line-2d>
|
||||||
(int:make-line-2d start-pos end-pos thickness)
|
(int:make-line-2d start-pos end-pos thickness)
|
||||||
line-2d?
|
line-2d?
|
||||||
|
|
@ -317,6 +324,19 @@
|
||||||
(end-pos line-2d-end-pos int:set-line-2d-end-pos!)
|
(end-pos line-2d-end-pos int:set-line-2d-end-pos!)
|
||||||
(thickness line-2d-thickness int:set-line-2d-thickness!))
|
(thickness line-2d-thickness int:set-line-2d-thickness!))
|
||||||
|
|
||||||
|
(define (make-line-2d start-pos end-pos thickness)
|
||||||
|
(assert (vector2? start-pos))
|
||||||
|
(assert (vector2? end-pos))
|
||||||
|
(assert ((conjoin integer? positive?) thickness))
|
||||||
|
(int:make-line-2d start-pos end-pos thickness))
|
||||||
|
|
||||||
|
(define set-line-2d-start-pos!
|
||||||
|
(guarded-mutator line-2d? 'start-pos vector2?))
|
||||||
|
(define set-line-2d-end-pos!
|
||||||
|
(guarded-mutator line-2d? 'end-pos vector2?))
|
||||||
|
(define set-line-2d-thickness!
|
||||||
|
(guarded-mutator line-2d? 'start-pos (conjoin integer? positive?)))
|
||||||
|
|
||||||
(define-record-type <circle-2d>
|
(define-record-type <circle-2d>
|
||||||
(int:make-circle-2d center radius filled)
|
(int:make-circle-2d center radius filled)
|
||||||
circle-2d?
|
circle-2d?
|
||||||
|
|
@ -324,6 +344,19 @@
|
||||||
(radius circle-2d-radius int:set-circle-2d-radius!)
|
(radius circle-2d-radius int:set-circle-2d-radius!)
|
||||||
(filled circle-2d-filled? int:set-circle-2d-filled!))
|
(filled circle-2d-filled? int:set-circle-2d-filled!))
|
||||||
|
|
||||||
|
(define (make-circle-2d center radius filled)
|
||||||
|
(assert (vector2? center))
|
||||||
|
(assert ((conjoin integer? positive?) radius))
|
||||||
|
(assert (boolean? filled))
|
||||||
|
(int:make-circle-2d center radius filled))
|
||||||
|
|
||||||
|
(define set-circle-2d-center!
|
||||||
|
(guarded-mutator circle-2d? 'center vector2?))
|
||||||
|
(define set-circle-2d-radius!
|
||||||
|
(guarded-mutator circle-2d? 'radius ((conjoin integer? positive?) radius)))
|
||||||
|
(define set-circle-2d-filled!
|
||||||
|
(guarded-mutator circle-2d? 'filled boolean?))
|
||||||
|
|
||||||
;; TODO: might be nicer to have the origin and width/height inside a rect-2d type or similar
|
;; TODO: might be nicer to have the origin and width/height inside a rect-2d type or similar
|
||||||
(define-record-type <rectangle-2d>
|
(define-record-type <rectangle-2d>
|
||||||
(int:make-rectangle-2d origin width height filled thickness)
|
(int:make-rectangle-2d origin width height filled thickness)
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,8 @@
|
||||||
(module (engine guards) ()
|
(module (engine guards) ()
|
||||||
(import scheme
|
(import scheme
|
||||||
(chicken base)
|
(chicken base)
|
||||||
(chicken module))
|
(chicken module)
|
||||||
|
(srfi 99))
|
||||||
|
|
||||||
;; Utility function for guarding parameter values
|
;; Utility function for guarding parameter values
|
||||||
(export guarded-parameter)
|
(export guarded-parameter)
|
||||||
|
|
@ -10,4 +11,15 @@
|
||||||
(if (predicate val)
|
(if (predicate val)
|
||||||
val
|
val
|
||||||
default))))
|
default))))
|
||||||
|
|
||||||
|
;; Shorthand for defining a guarded mutator for a record field
|
||||||
|
(define (guarded-mutator record-type field predicate)
|
||||||
|
(lambda (rec val)
|
||||||
|
(assert (record-type rec))
|
||||||
|
(assert (predicate val))
|
||||||
|
((rtd-mutator (record-rtd rec) field) rec val)))
|
||||||
|
|
||||||
|
;; TODO: define a similar function here for record constructor
|
||||||
|
|
||||||
|
;; TODO: define a similar function here for binary operations on records
|
||||||
)
|
)
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue