поведение функции var - PullRequest
       3

поведение функции var

0 голосов
/ 23 октября 2011

У меня есть две проблемы, связанные со следующими:

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

В первом случае, поскольку 5 - это не символ, я бы не ожидал, что (meta (var 5)) будет оцениваться, но это так (или, по крайней мере, так мне кажется).

Во втором случае, если я хочу поместить первое выражение в функцию и параметризовать проверяемое значение, функция (var ...) больше не работает.

1 Ответ

1 голос
/ 23 октября 2011

Объект Var - это , который был найден во время компиляции . Для поведения, которое я выведу из ваших примеров, вы должны использовать 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...