9
votes

Clojure: Déterminez si une fonction existe

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: xxx

merci


1 commentaires

Notez également le mot "appelable" est surchargé ici. Toutes les fonctions de clojure sont java.util.concurrent.callables.


3 Réponses :


-1
votes
(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.

0 commentaires

0
votes

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))))


1 commentaires

Augh non. Utilisation de résolution est un signe que vous pourriez faire quelque chose de mal; En utilisant eval pour faire la même tâche est un signe certain que vous faites quelque chose de mal.



18
votes

Vous recherchez une résolution, xxx

renvoie nul xxx

retour # 'clojure.core / filtre < p> Pour vérifier si un var est une fonction (crédit va à @Amalloy): xxx


6 commentaires

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»))) - RESOLVE Retourne la classe ou Var, pas quelque chose avec Fn 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)))


@Justin Kramer: @Joost utilisé eval 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?) .