2011-10-23 3 views
0

J'ai deux problèmes connexes en quelque sorte, montré par ce qui suit:de la fonction var

user=> (if (symbol? 5) (meta (var 5)) 5) 
CompilerException java.lang.ClassCastException: java.lang.Long cannot be cast to clojure.lang.Symbol, compiling:(NO_SOURCE_PATH:6) 
user=> (defn dometa [x] (if (symbol? x) (meta (var x)) x)) 
CompilerException java.lang.RuntimeException: Unable to resolve var: x in this context, compiling:(NO_SOURCE_PATH:7) 
user=> 

Dans le premier cas, puisque 5 est pas un symbole que je ne serais pas attendre (meta (var 5)) à évaluer, mais il est (ou du moins c'est comme ça que ça me semble).

Dans le second cas, si je veux placer la première expression dans une fonction et paramétrer la valeur testée, la fonction (var ...) ne fonctionne plus.

+0

'var' n'est pas une fonction, c'est une forme spéciale. – mtyaka

Répondre

1

L'objet Var est looked up at compile time. Pour le comportement que je déduis de vos exemples, vous devez utiliser find-var.

 
user=> (if (symbol? 5) (meta (find-var 5)) 5) 
5 
user=> (defn dometa [x] (if (symbol? x) (meta (find-var x)) x)) 
#'user/dometa 
+0

Vous voulez probablement 'resolve', pas' find-var'. Je n'avais jamais entendu parler de 'find-var' avant, mais cela ressemble à une version de' resolve'. – amalloy

Questions connexes