Visual guarding and predicate cleanup

This commit is contained in:
BirDt_ 2026-04-06 13:42:31 +08:00
parent 71e92641f7
commit 5a67f5c53f
2 changed files with 55 additions and 10 deletions

View file

@ -65,7 +65,7 @@
(record? vec2)))
(assert (eq? (rtd-name (record-rtd vec1))
(rtd-name (record-rtd vec2))))
(assert (any (lambda (pred) (pred vec1)) (list vector2?)))
(assert ((disjoin vector2?) vec1))
(cond
((vector2? vec1)
(and (= (vector-x vec1) (vector-x vec2))
@ -77,7 +77,7 @@
(record? vec2)))
(assert (eq? (rtd-name (record-rtd vec1))
(rtd-name (record-rtd vec2))))
(assert (any (lambda (pred) (pred vec1)) (list vector2?)))
(assert ((disjoin vector2?) vec1))
(cond
((vector2? vec1)
(make-vector2 (+ (vector-x vec1) (vector-x vec2))
@ -89,7 +89,7 @@
(record? vec2)))
(assert (eq? (rtd-name (record-rtd vec1))
(rtd-name (record-rtd vec2))))
(assert (any (lambda (pred) (pred vec1)) (list vector2?)))
(assert ((disjoin vector2?) vec1))
(cond
((vector2? vec1)
(make-vector2 (- (vector-x vec1) (vector-x vec2))
@ -101,7 +101,7 @@
(record? vec2)))
(assert (eq? (rtd-name (record-rtd vec1))
(rtd-name (record-rtd vec2))))
(assert (any (lambda (pred) (pred vec1)) (list vector2?)))
(assert ((disjoin vector2?) vec1))
(cond
((vector2? vec1)
(make-vector2 (* (vector-x vec1) (vector-x vec2))
@ -113,7 +113,7 @@
(record? vec2)))
(assert (eq? (rtd-name (record-rtd vec1))
(rtd-name (record-rtd vec2))))
(assert (any (lambda (pred) (pred vec1)) (list vector2?)))
(assert ((disjoin vector2?) vec1))
(cond
((vector2? vec1)
(make-vector2 (/ (vector-x vec1) (vector-x vec2))
@ -121,7 +121,7 @@
;; Magnitude
(define (vector-magnitude vec)
(assert (any (lambda (pred) (pred vec)) (list vector2?)))
(assert ((disjoin vector2?) vec))
(cond
((vector2? vec)
(sqrt (+ (expt (vector-x vec) 2)
@ -132,7 +132,7 @@
(record? vec2)))
(assert (eq? (rtd-name (record-rtd vec1))
(rtd-name (record-rtd vec2))))
(assert (any (lambda (pred) (pred vec1)) (list vector2?)))
(assert ((disjoin vector2?) vec1))
(cond
((vector2? vec1)
(+ (* (vector-x vec1) (vector-x vec2))
@ -143,7 +143,7 @@
(record? vec2)))
(assert (eq? (rtd-name (record-rtd vec1))
(rtd-name (record-rtd vec2))))
(assert (any (lambda (pred) (pred vec1)) (list vector2?)))
(assert ((disjoin vector2?) vec1))
(cond
((vector2? vec1)
(acos (/ (vector-dot vec1 vec2)
@ -152,7 +152,7 @@
;; Normalization
(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)))
(cond
((vector2? vec)
@ -310,6 +310,13 @@
pixel-2d?
(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>
(int:make-line-2d start-pos end-pos thickness)
line-2d?
@ -317,6 +324,19 @@
(end-pos line-2d-end-pos int:set-line-2d-end-pos!)
(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>
(int:make-circle-2d center radius filled)
circle-2d?
@ -324,6 +344,19 @@
(radius circle-2d-radius int:set-circle-2d-radius!)
(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
(define-record-type <rectangle-2d>
(int:make-rectangle-2d origin width height filled thickness)

View file

@ -1,7 +1,8 @@
(module (engine guards) ()
(import scheme
(chicken base)
(chicken module))
(chicken module)
(srfi 99))
;; Utility function for guarding parameter values
(export guarded-parameter)
@ -10,4 +11,15 @@
(if (predicate val)
val
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
)