Вы можете предоставить sbcl
некоторую информацию о типе ваших данных:
(defun test (x y)
(declare (optimize (speed 3))
(type rational x y))
(< x y))
Вы должны решить, можете ли вы указывать тип x
и y
при любых обстоятельствах или нет.
Более подробную информацию об объявлении типа вы можете найти в hyperspec и sbcl's manual .
EDIT
Я не знаю, имеет ли это смысл, но можно подумать о другом слое, который решает, какая функция вызывается:
(defun test% (x y)
(declare (optimize (speed 3)))
(if (and (typep x 'rational) (typep y 'rational))
(test-rational x y)
(test-float x y)))
(defun test-rational (x y)
(declare (optimize (speed 3))
(type rational x y))
(< x y))
(defun test-float (x y)
(declare (optimize (speed 3))
(type float x y))
(< x y))
Я думаю, что есть место для дальнейшей оптимизации с использованием typecase
или определенияметоды для каждого типа, использующие CLOS
.