koans - triangle
using cond, which is ok (destructuring would be nice) and signaling errors, copying definitions of errors and not quite proficient with writing code that has guards against errors
This commit is contained in:
parent
586f06fbf2
commit
cdeeb2fead
|
@ -14,11 +14,24 @@
|
||||||
|
|
||||||
(define-condition triangle-error (error)
|
(define-condition triangle-error (error)
|
||||||
;; Fill in the blank with a suitable slot definition.
|
;; Fill in the blank with a suitable slot definition.
|
||||||
(____))
|
((triangle-error-sides :initarg :sides :reader triangle-error-sides)))
|
||||||
|
|
||||||
(defun triangle (a b c)
|
(defun triangle (a b c)
|
||||||
;; Fill in the blank with a function that satisfies the below tests.
|
;; Fill in the blank with a function that satisfies the below tests.
|
||||||
____)
|
(cond
|
||||||
|
((or (<= a 0) (<= b 0) (<= c 0)) (signal (make-condition 'type-error
|
||||||
|
:datum (car (remove-if-not (lambda (n) (>= 0 n)) (list a b c)))
|
||||||
|
:expected-type '(real (0)))))
|
||||||
|
((or (<= (+ a b) c) (<= (+ b c) a) (<= (+ a c) b)) (signal (make-condition 'triangle-error
|
||||||
|
:sides (list a b c))))
|
||||||
|
((= a b c) :equilateral)
|
||||||
|
((or (= a b) (= b c) (= a c)) :isosceles)
|
||||||
|
(t :scalene)))
|
||||||
|
|
||||||
|
(car (remove-if (lambda (n) (>= 0 n)) (list 1 2 -2)))
|
||||||
|
|
||||||
|
(triangle 1 1 1)
|
||||||
|
(triangle 0 0 0)
|
||||||
|
|
||||||
(define-test equilateral-triangles
|
(define-test equilateral-triangles
|
||||||
;; Equilateral triangles have three sides of equal length,
|
;; Equilateral triangles have three sides of equal length,
|
||||||
|
@ -39,6 +52,18 @@
|
||||||
(assert-equal :scalene (triangle 10 11 12))
|
(assert-equal :scalene (triangle 10 11 12))
|
||||||
(assert-equal :scalene (triangle 5 4 2)))
|
(assert-equal :scalene (triangle 5 4 2)))
|
||||||
|
|
||||||
|
(defun triangle-failure (a b c)
|
||||||
|
(handler-case (progn (triangle a b c) (error "Test failure"))
|
||||||
|
(error (condition) condition)))
|
||||||
|
(triangle 0 0 0)
|
||||||
|
(setq condi (triangle-failure 2 -1 1))
|
||||||
|
(type-error-datum condi)
|
||||||
|
(type-error-expected-type condi)
|
||||||
|
|
||||||
|
(setq condi (triangle-failure 2 4 2))
|
||||||
|
(triangle-error-sides condi)
|
||||||
|
|
||||||
|
|
||||||
(define-test illegal-triangles
|
(define-test illegal-triangles
|
||||||
;; Not all triplets make valid triangles.
|
;; Not all triplets make valid triangles.
|
||||||
(flet ((triangle-failure (a b c)
|
(flet ((triangle-failure (a b c)
|
||||||
|
|
Loading…
Reference in New Issue