Заказ списка смешанных типов данных в 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)))))

Как сказал Терье, вы не должны использовать сортировку, уменьшить намного лучше:)

Другие вопросы по тегам