Определения максимума и минимума нуждаются в улучшении. СОРТ разрушительный. Также неправильно называть SORT с буквальной константой, такой как '(1 2 3 4) - опять же, SORT разрушителен.
Лучшие определения:
(defun minimum (list)
(reduce #'min list))
(defun maximum (list)
(reduce #'max list))
Более эффективное определение диапазона:
(defun range (list)
(loop for e in list
maximize e into max
minimize e into min
finally (return (- max min))))
SCALE-LIST и SCALE-VALUE также не похожи на Lisp.
Если вы вызываете NTH как это в рекурсивной функции, то что-то не так. Вы должны пройти по списку, а не по индексу. SCALE-VALUE вызывает RANGE и MINIMUM для каждого вызова. Почему?
Проверить этот вариант:
;;scales one value to another range
(defun scale-value (item low high min range)
(+ (/ (* (- item min)
(- high low))
range)
low))
;;is supposed to scale the whole list to another range
(defun scale-list (list low high)
(let ((min (minimum list))
(range (range list)))
(labels ((scale-list-aux (list)
(when list
(cons (scale-value (first list) low high min range)
(scale-list-aux (rest list))))))
(scale-list-aux list))))
(scale-list '(1 2 3 4) 21 24)
Что вы можете улучшить еще? Например, я бы избавился от рекурсии и заменил ее на MAPCAR.