Lisp中的负无穷大

时间:2011-12-12 13:31:51

标签: lisp fixnum

我正在寻找在Lisp中表示负无穷大的标准方法。是否有一个符号值,Lisp的算术函数可以识别为少于所有其他数字?

具体来说,我正在寻找一种优雅的方式来撰写以下内容:

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

2 个答案:

答案 0 :(得分:7)

ANSI Common Lisp具有bignum,只要您有足够的空间,它就可以用来表示任意大的数字,但它没有指定“无穷大”值。一些实现可能,但这不是标准的一部分。

在您的情况下,我认为您必须根据您的功能目的重新考虑您的方法:找到列表中的最大数字。但是,尝试在空列表中找到最大数字是无效/无意义的,因此您需要提供该情况。因此,您可以定义前置条件,如果不满足,则返回nil或引发错误。实际上这就是内置函数max的作用。

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

编辑:正如Rainer Joswig所指出的,Common Lisp不允许arbitrarily long argument lists,因此最好使用reduce代替apply。< / p>

(reduce #'max '(1 2 3 4))

答案 1 :(得分:3)

ANSI Common Lisp中没有类似的东西。 Common Lisp实现(甚至数学应用程序)的负无穷大表示不同。

例如在LispWorks中用于双浮点数:

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