;; --------------------------------------------------------------------- ;; This file implements a range-case macro motivated by the code we ;; wrote for the opening exercise in Session 4 ;; http://www.cs.uni.edu/~wallingf/teaching/cs3540 ;; /sessions/session04.html#cond-exercise ;; (range-case student-grade ;; ((0.90 1.00) 'A) ;; ((0.80 0.90) 'B) ;; ((0.70 0.80) 'C) ;; ((0.60 0.70) 'D) ;; (else 'F)) ;; ;; expands into ;; ;; (if (and (>= student-grade 0.90) (<= student-grade 1.00)) ;; 'A ;; (if (and (>= student-grade 0.80) (<= student-grade 0.90)) ;; 'B ;; (if (and (>= student-grade 0.70) (<= student-grade 0.80)) ;; 'C ;; (if (and (>= student-grade 0.60) (<= student-grade 0.70)) ;; 'D ;; 'F)))) ;; --------------------------------------------------------------------- #lang racket (require rackunit) (define-syntax range-case (syntax-rules (else) [(range-case id (else default)) default] [(range-case id ((lower upper) value) rest ...) ;; change (if (and (>= id lower) (<= id upper)) ;; change value (range-case id rest ...))] )) ;; --------------------------------------------------------------------- ;; a few rackunit tests ;; --------------------------------------------------------------------- (define student-grade (/ 248.0 285)) (check-equal? (range-case student-grade ; the example from Session 4 ((0.90 1.00) 'A) ((0.80 0.90) 'B) ((0.70 0.90) 'C) ((0.60 0.70) 'D) (else 'F)) 'B) (check-equal? (range-case student-grade (else 'F)) 'F) (check-equal? (range-case student-grade ((0.90 1.00) 'A) (else 'F)) 'F) (check-equal? (range-case 0.95 ((0.90 1.00) 'A) (else 'F)) 'A) ;; ---------------------------------------------------------------------