Comment puis-je savoir si un nom de fonction fourni sous forme de chaîne est appelable ou non dans le contexte actuel? quelque chose comme: merci p> p>
3 Réponses :
(defn callable? [name] (clojure.test/function? (symbol name))) UPD. I found out that fn? checks only for interface Fn and doesn't work for resolved symbol. Though, clojure.test/function? does what is needed, so I updated an example.
chances sont si vous en avez besoin, vous faites quelque chose de mal, mais ...
(defn callable? [s] (let [obj (try (eval (symbol s)) (catch Exception e))] (and obj (fn? obj))))
Augh non. Utilisation de résolution code> est un signe que vous pourriez faire quelque chose de mal; En utilisant eval code> pour faire la même tâche est un signe certain que vous faites quelque chose de mal.
Vous recherchez une résolution, renvoie nul p> retour # 'clojure.core / filtre p> p> < p> Pour vérifier si un var est une fonction (crédit va à @Amalloy): p>
Il retourne ce que vous avez dit, mais comment puis-je déterminer s'il est appelable ou non?
Vous pouvez appeler (fn? (Résoudre (Symbole "Filtre")) - Je le recommanderais sur ma réponse
@JoostDiePenmaat: Dans ce cas (fn? (Filtre Eval (Symbole (Symbole "Filtre»))) CODE> - RESOLVE code> Retourne la classe ou Var, pas quelque chose avec Fn code > Interface (voir ma réponse) et ne fonctionnera donc pas.
@ffriend, juste Deref le var: (lorsque-let [f (résolution (Symbole "filtre"))] (et (var? f) (fn? @f))) code>
@Justin Kramer: @Joost utilisé eval code> dans sa réponse, donc je l'ai proposé. Bien sûr, la désirer est une voie plus idiomatique pour le clojure.
Vous ne devriez probablement pas faire cela du tout, mais toute une solution est (-> Sy symbole résolve DEREF IFN?) Code>.
Notez également le mot "appelable" est surchargé ici. Toutes les fonctions de clojure sont java.util.concurrent.callables.