flavored - clojure tutorial
Usando la función de símbolo de clojure para hacer una llamada de función indirecta. (1)
A continuación, espero que pueda llamar mi función cuadrada indirectamente a través de la función de símbolo, pero no funciona. Qué estoy haciendo mal aquí:
user=> (defn squared [x] (* x x))
#''user/squared
user=> (squared 2)
4
user=> ((symbol "squared") 2)
nil
user=> ((symbol "user" "squared") 2)
nil
user=>
El símbolo en sí no tiene su función, la Var que nombra lo hace.
Esto dice "tome el contenido ( @
= deref
) de la Var ( resolve
) nombrada por el símbolo ( symbol
) cuyo nombre es "squared"
y aplíquelo (como una función) al argumento 2
:
(@(resolve (symbol "squared")) 2)
Esto dice "toma el Var nombrado por el símbolo, etc.":
((resolve (symbol "squared")) 2)
Ambos funcionarán, ya que Vars, cuando se le pida que actúe como una función, difiere a las funciones almacenadas en ellos. (Si intenta usar un Var como función cuando no está vinculado a una función, se producirá un error).
Esto dice "tome el símbolo llamado "squared"
y aplíquelo como una función al argumento 2
"; tenga en cuenta que el símbolo en sí se usa como la función:
((symbol "squared") 2)
Ahora, los símbolos se pueden usar como funciones (implementan la interfaz clojure.lang.IFn
), pero la forma en que actúan cuando se usan de esta manera es que buscan su propio argumento, es decir, tratan su argumento como un mapa y realizan una búsqueda. dentro de eso:
(''foo {''foo 2})
; is equivalent to
(get {''foo 2} ''foo)
Si el argumento pasado a un símbolo no es algo en lo que tiene sentido hacer búsquedas, se devuelve nil
.