Estoy tratando de elegir Lisp como mi nuevo idioma, y estoy teniendo algunos problemas para determinar cómo funcionan las partes de una función en cada elemento de la lista que se le pasa.defun con una lista como argumento
Con el fin de aprender cómo evitar esto, estoy tratando de escribir una forma bastante básico de la división no estirar la pata cuando uno de los elementos de la lista son 0 (pero en cambio sólo devuelve 0)
(defun divtest (elements)
(dolist (x elements)
(if (zerop x) 0())
(/ elements)))))
intento funcionar esto como:
(divtest '(20 2 5))
que produce:
*** - /: (20 2 5) is not a number
El punto de falla parece estar arraigado en el hecho de que no estoy "extrayendo" los elementos en la lista antes de pasarlos a la función (en este caso, ni/ni dolist funciona como se esperaba, ya que x nunca se evalúa a 0). Si estoy en lo cierto, ¿alguien me puede decir cómo realizar esta "extracción"?
Nota: Esta pregunta está relacionada con one that I've asked earlier, pero que a mí no está claro sobre qué parte de la respuesta anterior permitió realmente que funcione como se pretende con este problema específico que decidí ir más lejos en los fundamentos
use REDUCE en lugar de APLICAR –
Simplemente curioso: ¿cuál sería la utilidad de eso? – Hugh
de esta manera podría procesar listas largas arbitrarias y no solo las de CALL-ARGUMENT-LIMIT (una constante CL estándar) longitud máxima. Common Lisp tiene una implementación dependiente del número máximo de argumentos. Este número debe ser 50 o más grande. Esto significa que una implementación solo necesita admitir 50 argumentos (o más). Por lo tanto, su función anterior puede fallar en alguna implementación en la que la lista de números sea más larga que la cantidad de argumentos que llama a la función/permite. –