Hay otro enfoque es posible que desee considerar: partial funciones. Se podría decir que son una forma más "funcional" y más flexible de especificar valores predeterminados para las funciones.
de inicio mediante la creación (si es necesario) una función que tiene el parámetro (s) que desea ofrecer por defecto (s) como el parámetro (s) que conduce:
(defn string->integer [base str]
(Integer/parseInt str base))
Esto se hace porque Clojure de La versión de partial
le permite proporcionar los valores "predeterminados" solo en el orden en que aparecen en la definición de la función.Una vez que los parámetros han sido ordenados como se desee, a continuación, puede crear una versión "default" de la función utilizando la función partial
:
(partial string->integer 10)
Con el fin de realizar esta función se puede llamar varias veces se puede poner en un var usando def
:
(def decimal (partial string->integer 10))
(decimal "10")
;10
también podría crear un "predeterminada local" usando let
:
(let [hex (partial string->integer 16)]
(* (hex "FF") (hex "AA")))
;43350
El enfoque de función parcial tiene una ventaja clave sobre los demás: el consumidor de la función aún puede decidir cuál será el valor predeterminado en lugar del productor de la función sin necesidad de modificar la definición de función. Esto se ilustra en el ejemplo con hex
donde he decidido que la función predeterminada decimal
no es lo que quiero.
Otra ventaja de este enfoque es que puede asignar a la función predeterminada un nombre diferente (decimal, hexadecimal, etc.) que puede ser más descriptivo y/o diferente (var, local). La función parcial también puede ser mezclado con algunos de los enfoques más arriba si lo desea:
(defn string->integer
([s] (string->integer s 10))
([base s] (Integer/parseInt s base)))
(def hex (partial string->integer 16))
(Nota esto es ligeramente diferente de la respuesta de Brian como el orden de los parámetros se ha invertido por las razones expuestas en la parte superior de esta respuesta)
Creo que sería mejor para la segunda línea de decir '(s repiten 10)', usando [ 'recur'] (http: //grimoire.arrdem .com/1.6.0/clojure.core/recur /) en lugar de repetir el nombre de la función 'string-> integer'. Eso haría que sea más fácil cambiar el nombre de la función en el futuro. ¿Alguien sabe alguna razón para no usar 'recur' en estas situaciones? –
Parece que 'recurrir' solo funciona en el mismo arity. si intentó recurrir arriba, por ejemplo: 'java.lang.IllegalArgumentException: recuento de argumentos no coincidentes para recurrir, esperado: 1 args, got: 2, compilación:' – djhaskin987
Se encontró con este mismo problema. ¿Tendría sentido tener la llamada a la función en sí misma (es decir '(string-> integer s 10)')? –