Lisp中的负无穷大

jfo*_*erg 5 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)))))
Run Code Online (Sandbox Code Playgroud)

Dai*_*rod 7

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

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

(apply #'max '(1 2 3 4)) => 4
(apply #'max nil) => error
Run Code Online (Sandbox Code Playgroud)

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

(reduce #'max '(1 2 3 4))
Run Code Online (Sandbox Code Playgroud)

  • 由于Common Lisp中的函数不允许任意长参数列表,因此最好用REDUCE替换APPLY.查看变量CALL-ARGUMENTS-LIMIT的值.实现最多支持CALL-ARGUMENTS-LIMIT长参数列表.在您的示例中,这意味着实现可能无法计算CALL-ARGUMENTS-LIMIT + 1长列表中的最大值.请注意,这个CALL-ARGUMENTS-LIMIT的值可以小到50(!). (4认同)