Здесь другой набор возможностей, в дополнение к тем, которые предложены в других ответах.
Прежде всего, при написании функции следует также проверять специальные случаи, пока вы не проверяете пустой список , Таким образом, структура функции может быть такой:
(defun maximum (l)
(if (null l)
nil ; or give an error
...normal solution...))
В случае возврата nil
эта структура в Common Lisp идентична следующей, учитывая, что and
оценивает свои аргументы в последовательности и возвращает nil
, как только аргумент оценивается как nil
, в противном случае возвращает значение последнего аргумента:
(defun maximum (l)
(and l ...normal solution...))
Здесь представлены альтернативные решения.
Без l oop или рекурсия с предопределенными функциями reduce
( ручной ) и max
( ручной ).
(defun maximum (l)
(and l (reduce #'max l)))
С конструкцией dolist
( manual ), который перебирает переменную по списку:
(defun maximum (l)
(and l (let ((result (car l)))
(dolist (x (cdr l) result)
(when (> x result)
(setf result x))))))
И, наконец, с компактной версией do
( manual ):
(defun maximum (l)
(and l (do ((maximum-so-far (car l) (max (pop l) maximum-so-far)))
((null l) maximum-so-far))))