(defmacro unless (test :rest body) `(if (not ,test) (progn ,@body))) (defmacro assert (test) `(unless ,test (error "assert: value is false." ',test))) (defun sum (sequence) (let ((res 0)) (for ((xs sequence (cdr xs))) ((null xs) res) (setq res (+ res (car xs)))))) (defun average-of-absolutes (values) (the values) ;; requires non-null list (assert (> (length values) 0)) (let ((res (quotient (sum values) (length values)))) ;; must ensure positive result (assert (>= res 0)) (the res))) ;; (average-of-absolutes '(1 3)) ;; (average-of-absolutes '())