big
называется max
. Используйте стандартные функции библиотеки, когда она там есть.
Мой подход другой. Вместо множества тестов я просто складываю квадраты всех трех, а затем вычитаю квадрат из наименьшего.
(define (exercise1.3 a b c)
(let ((smallest (min a b c))
(square (lambda (x) (* x x))))
(+ (square a) (square b) (square c) (- (square smallest)))))
Предпочитаете ли вы этот подход или набор if
тестов, конечно, решать вам.
Альтернативная реализация с использованием SRFI 95 :
(define (exercise1.3 . args)
(let ((sorted (sort! args >))
(square (lambda (x) (* x x))))
(+ (square (car sorted)) (square (cadr sorted)))))
Как указано выше, но в виде одной строки (спасибо synx @ freenode #scheme); также требуется SRFI 1 и SRFI 26 :
(define (exercise1.3 . args)
(apply + (map! (cut expt <> 2) (take! (sort! args >) 2))))