2011-12-12 32 views
5

Estoy buscando la forma estándar de representar el infinito negativo en Lisp. ¿Hay algún valor simbólico que las funciones aritméticas de Lisp reconozcan como menos que todos los demás números?Infinito negativo en Lisp

Específicamente, estoy buscando una manera elegante de escribir lo siguiente:

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

Respuesta

7

ANSI Common Lisp tiene bignum, que puede utilizarse para representar números muy grandes, siempre y cuando usted tiene suficiente espacio, pero no especifica un "infinito "valor" Algunas implementaciones pueden, pero eso no es parte del estándar.

En su caso, creo que debe reconsiderar su enfoque en función del objetivo de su función: encontrar el número más grande en una lista. Sin embargo, tratar de encontrar el número más grande en una lista vacía es inválido/sin sentido, por lo que debe proporcionar ese caso. De modo que puede definir una condición previa y, si no se cumple, devuelva nil o genere un error. Que de hecho es lo que hace la función incorporada max.

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

EDIT: Como se ha señalado por Rainer Joswig, Common Lisp no permite arbitrarily long argument lists, por tanto, lo mejor es utilizar reduce en lugar de apply.

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

Gracias. No sabía que Max tomaba una cantidad arbitraria de argumentos, pero eso proporciona una solución elegante. – jforberg

+4

Dado que las funciones en Common Lisp no permiten listas arbitrarias de argumentos largos, lo mejor es reemplazar APLICAR con REDUCIR. Vea el valor de la variable CALL-ARGUMENTS-LIMIT. Una implementación admite hasta listas largas de argumentos CALL-ARGUMENTS-LIMIT. En su ejemplo, esto significaría que una implementación puede fallar al calcular el máximo en CALL-ARGUMENTS-LIMIT + 1 listas largas. Tenga en cuenta que este valor de CALL-ARGUMENTS-LIMIT puede ser tan pequeño como 50 (!). –

+0

@RainerJoswig: Oh, tienes toda la razón. – Daimrod

3

No hay nada como eso en ANSI Common Lisp. Las implementaciones de Common Lisp (e incluso las aplicaciones matemáticas) difieren en su representación de infinito negativo.

Por ejemplo, en LispWorks para los flotadores dobles:

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