Отрицательная бесконечность в Лиспе - PullRequest
5 голосов
/ 12 декабря 2011

Я ищу стандартный способ представления отрицательной бесконечности в Лиспе. Есть ли символическое значение, которое распознается арифметическими функциями Лиспа как меньшее, чем все другие числа?

В частности, я ищу элегантный способ написать следующее:

(defun largest (lst)
  "Evaluates to the largest number in lst"
  (if (null lst)
    ***negative-inifinity***
    (max (car lst) (largest (cdr lst)))))

Ответы [ 2 ]

7 голосов
/ 12 декабря 2011

ANSI Common Lisp имеет bignum, который может использоваться для представления произвольно больших чисел, если у вас достаточно места, но он не указывает значение "бесконечность".Некоторые реализации могут, но это не является частью стандарта.

В вашем случае, я думаю, вам нужно переосмыслить свой подход, исходя из цели вашей функции: найти наибольшее числов списке.Попытка найти наибольшее число в пустом списке недопустима / бессмысленна, так что вы хотите указать этот случай.Таким образом, вы можете определить предварительное условие и, если оно не выполнено, вернуть nil или вызвать ошибку.Именно это и делает встроенная функция max.

(apply #'max '(1 2 3 4)) => 4
(apply #'max nil) => error

РЕДАКТИРОВАТЬ: Как указал Райнер Йосвиг, Common Lisp не позволяет произвольно длинные списки аргументов , поэтому лучше использовать reduce вместо apply.

(reduce #'max '(1 2 3 4))
3 голосов
/ 12 декабря 2011

В ANSI Common Lisp ничего подобного нет. Обычные реализации на Лиспе (и даже математические приложения) отличаются представлением отрицательной бесконечности.

Например, в LispWorks для двойных операций с плавающей запятой:

CL-USER 23 > (* MOST-NEGATIVE-DOUBLE-FLOAT 10)
-1D++0
...