Заказ списка смешанных типов данных в lisp - PullRequest
0 голосов
/ 25 мая 2011

С учетом списка любой длины и типа данных рассчитайте:

  • Нижний элемент
  • Высокий элемент
  • Символы
  • Среднее
  • Перевернутый список (реализация функции)

Я пытался самостоятельно выучить шепот, потому что мой класс немного бесполезен (прочитайте мой другой вопрос = _ =;), и я 'мы сделали это:

(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 Ответ

3 голосов
/ 26 мая 2011

Функция # '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)))))

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

...