2010-08-04 5 views
12

En clojure 1.2RC1, je souhaite obtenir une fonction basée sur son nom en tant que chaîne et l'évaluer.Fonction de résolution de clojure à partir du nom de chaîne

Définition de la fonction

(ns my-ns) 

(defn mycar [x] (first x)) 

Voici travaillé:

((ns-resolve *ns* (symbol "mycar")) '(3 4)) 
((intern *ns* (symbol "mycar")) '(3 4)) 
((eval (symbol "mycar")) '(3 4)) 

mais ils semblent laids. Y a-t-il un meilleur moyen? Si non, lequel des énoncés ci-dessus est le plus idiomatique?

Répondre

13

Cela a fonctionné pour moi sans utiliser eval:

user> (defn mycar [x] (first x)) 
#'user/mycar 
user> ((resolve (symbol "mycar")) [1 2 3]) 
1 

Cela fonctionne parce que trouve le décide mycar var dans l'espace actuel et le var appelle la fonction qu'il est lié. Ceci est une version plus courte de votre premier exemple. Je l'utiliserais juste pour que je puisse éviter d'utiliser eval.

+1

Je seconde l'utilisation de 'resolve' ou' ns-resolve'. Faites également très attention lorsque vous utilisez 'intern'. Il est tout à fait de clobber des choses en l'utilisant. – kotarak

+0

Des pointeurs vers plus d'informations sur "clobbering" causé par interne? – chris

+0

Définir un Var avec interne et vos méta-données d'origine sur le Var sera parti. Ignorer. Semble être fixé. Au moins, je ne peux plus le reproduire. – kotarak

Questions connexes