6

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

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

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

2 回答 2

7

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

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

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

编辑:正如 Rainer Joswig 所指出的,Common Lisp 不允许任意长的参数列表,因此最好使用reduce而不是apply.

(reduce #'max '(1 2 3 4))
于 2011-12-12T13:58:39.463 回答
3

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

例如在 LispWorks 中的双浮点数:

CL-USER 23 > (* MOST-NEGATIVE-DOUBLE-FLOAT 10)
-1D++0
于 2011-12-12T13:56:44.540 回答