Sé que en Clojure hay soporte sintáctico para "nombrar" una función anónima, como han señalado otras respuestas. Sin embargo, quiero mostrar un enfoque de primeros principios para resolver la pregunta, uno que no dependa de la existencia de una sintaxis especial en el lenguaje de programación y que funcionaría en cualquier idioma con procedimientos de primer orden (lambdas).
En principio, si usted quiere hacer una llamada de función recursiva, es necesario hacer referencia al nombre de la función tan "anónimo" (es decir, sin nombre funciones) no se pueden utilizar para realizar una recursión ... a menos usa el Y-Combinator. Here es una explicación de cómo funciona en Clojure.
Déjame mostrarte cómo se usa con un ejemplo. En primer lugar, un Y-Combinator
que funcione para las funciones con un número variable de argumentos:
(defn Y [f]
((fn [x] (x x))
(fn [x]
(f (fn [& args]
(apply (x x) args))))))
Ahora, el anónima función que implementa el procedimiento power
como se define en la pregunta. Está claro que no tiene un nombre, power
sólo es un parámetro a la función externa:
(fn [power]
(fn [number exponent]
(if (zero? exponent)
1
(* number (power number (- exponent 1))))))
Por último, aquí es cómo aplicar el Y-Combinator
al procedimiento anónima power
, pasando como parámetros number=5
y exponent=3
(que no es recursiva de cola por cierto):
((Y
(fn [power]
(fn [number exponent]
(if (zero? exponent)
1
(* number (power number (- exponent 1)))))))
5 3)
> 125
Gracias Jeremy, no sabía sobre la opción de nombre. Estoy trabajando en las preguntas [4clojure] (http://www.4clojure.com/) y no permiten defn. La recurrencia de la cola es obviamente mejor, pero quiero caminar antes de correr :) –