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))
Grazie. Non sapevo che max avesse un numero arbitrario di argomenti, ma ciò fornisce una soluzione elegante. – jforberg
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 (!). –
@RainerJoswig: Oh, hai perfettamente ragione. – Daimrod