2011-12-12 7 views
5

Sto cercando il modo standard per rappresentare l'infinito negativo in Lisp. Esiste un valore simbolico che è riconosciuto dalle funzioni aritmetiche di Lisp come meno di tutti gli altri numeri?Infinito negativo in Lisp

In particolare, sto cercando un modo elegante per scrivere il seguente:

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

risposta

7

ANSI Common Lisp ha bignum, che può utilizzato per rappresentare arbitrariamente grandi numeri fino a quando si dispone di spazio sufficiente, ma non specifica un "infinito "valore. Alcune implementazioni possono, ma questo non fa parte dello standard.

Nel tuo caso, penso che devi ripensare il tuo approccio in base allo scopo della tua funzione: trovare il numero più grande in una lista. Cercando di trovare il numero più grande in una lista vuota non è valido/non ha senso, quindi, quindi si desidera fornire per quel caso. Quindi puoi definire una precondizione e, se non è soddisfatta, restituire nil o segnalare un errore. Che in effetti è ciò che fa la funzione integrata max.

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

EDIT: Come sottolineato di Rainer Joswig, Common Lisp non consente arbitrarily long argument lists, quindi è meglio usare reduce invece di apply.

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

Grazie. Non sapevo che max avesse un numero arbitrario di argomenti, ma ciò fornisce una soluzione elegante. – jforberg

+4

Poiché le funzioni in Common Lisp non consentono elenchi di argomenti lunghi e arbitrari, è consigliabile sostituire APPLY con REDUCE. Vedi il valore della variabile CALL-ARGUMENTS-LIMIT. Un'implementazione supporta fino a CALL-ARGUMENTS-LIMIT elenchi di argomenti lunghi. Nel tuo esempio significherebbe che un'implementazione potrebbe non riuscire a calcolare il massimo su CALL-ARGUMENTS-LIMIT + 1 liste lunghe. Si noti che questo valore di CALL-ARGUMENTS-LIMIT può essere piccolo come 50 (!). –

+0

@RainerJoswig: Oh, hai perfettamente ragione. – Daimrod

3

Non c'è niente di simile in ANSI Common Lisp. Le implementazioni comuni di Lisp (e persino le applicazioni matematiche) differiscono nella loro rappresentazione dell'infinito negativo.

Per esempio in LispWorks per i doppi carri:

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