2010-08-04 8 views
12

In clojure 1.2RC1, desidero ottenere una funzione in base al suo nome come stringa e valutarla.funzione di risoluzione del clojure da nome stringa

definizione della funzione

(ns my-ns) 

(defn mycar [x] (first x)) 

Il seguente lavorato:

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

ma sembrano brutti. C'è un modo migliore? Se no, quale di questi è il più idiomatico?

risposta

13

questo ha lavorato per me senza usare eval:

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

Questo funziona perché risolve trova il MyCar var nello spazio dei nomi corrente e la var chiama la funzione è destinato a. Questa è una versione più breve del tuo primo esempio. Lo userei solo per evitare di usare eval.

+1

I secondo l'uso di 'resolve' o' ns-resolve'. Prestare inoltre molta attenzione quando si usa 'intern'. È abbastanza per ingannare le cose che lo usano. – kotarak

+0

Eventuali puntatori a ulteriori informazioni su "clobbering" causati da stagisti? – chris

+0

Imposta un Var con intern e i tuoi meta data originali sul Var saranno spariti. Ignora. Sembra essere risolto. Almeno non riesco più a riprodurlo. – kotarak

Problemi correlati