2011-12-12 60 views
5

我正在尋找在Lisp中表示負無窮的標準方法。 Lisp算術函數認可的符號價值是否低於所有其他數字?Lisp中的負無窮

具體來說,我正在尋找一個優雅的方式來寫:

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

回答

7

ANSI Common Lisp的有bignum,它可以使用,只要你有足夠的空間來表示任意大的數字,但它沒有指定一個「無限「價值。一些實現可能,但這不是標準的一部分。

就你而言,我認爲你必須根據你的函數的目的重新思考你的方法:找到列表中最大的數字。儘管在空列表中查找最大的數字是無效/無稽之談,所以你想要提供這種情況。因此,您可以定義一個前提條件,如果不符合,則返回nil或引發錯誤。這實際上是內置函數max的功能。

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

編輯:正如指出的賴Joswig,Common Lisp中不允許arbitrarily long argument lists,因此最好使用reduce,而不是apply

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

謝謝。我沒有意識到max採用了任意數量的參數,但這提供了一個優雅的解決方案。 – jforberg

+4

由於Common Lisp中的函數不允許任意的長參數列表,所以最好用APPLY替換爲REDUCE。查看變量CALL-ARGUMENTS-LIMIT的值。實現最多支持CALL-ARGUMENTS-LIMIT長參數列表。在您的示例中,這意味着某個實現可能無法計算CALL-ARGUMENTS-LIMIT + 1長列表上的最大值。請注意,這個CALL-ARGUMENTS-LIMIT的值可以小到50(!)。 –

+0

@RainerJoswig:哦,你是完全正確的。 – Daimrod

3

有沒有像在ANSI Common Lisp的。 Common Lisp實現(甚至數學應用程序)在負無窮的表示方面有所不同。

例如在LispWorks雙浮筒:

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