Заказ списка смешанных типов данных в lisp
Приведен список любой длины и типа данных расчета:
- Нижний пункт
- Более высокий пункт
- Символы
- Средний
- Перевернутый список (реализация функции)
Я пытался выучить шумиху самостоятельно, так как мой класс бесполезен (прочитайте мой другой вопрос =_=;), и я сделал это:
(defun higher(l)
(let (x)
(setf x (first (sort l #'>)))))
Тогда это не упорядочивало символы, конечно... так что я попробовал это:
(defun higher(l)
(let ((x 0))
(dolist (a l)
(setf a (coerce a 'integer))
(if (> a x)
(setf x a)))
x))
но принуждение не помогает мне сделать мои символы целыми... заранее спасибо за вашу помощь, а также я хотел бы знать, хорошо ли я форматирую (меня не учили использовать "let").
1 ответ
Функция #'Char> не будет работать с символами, потому что символ не является символом типа.
Прежде чем сравнивать символы, вы можете использовать имя-символа:
(symbol-name 'a)
CL-USER> "A"
Так что теперь вы можете использовать #'string>
Чтобы написать функцию, которая сравнивает> любой тип данных, вы можете использовать typecase. Небольшой пример:
(defun compare> (x y)
(when (subtypep (type-of x) (type-of y))
(typecase (and x y)
(integer (> x y))
(character (char> x y)))))
Как сказал Терье, вы не должны использовать сортировку, уменьшить намного лучше:)