2010-11-16 2 views

ответ

24
user> (resolve 'foo) 
nil 
user> (def foo 3) 
#'user/foo 
user> (resolve 'foo) 
#'user/foo 
+0

Brilliant, работал в первый раз. Благодаря! :) – Zubair

6

resolve или ns-resolve может делать то, что вы ищете:

user> (def a 1) 
#'user/a 
user> (def b) 
#'user/b 
user> (resolve 'a) 
#'user/a 
user> (resolve 'b) 
#'user/b 
user> (resolve 'c) 
nil 

Чтобы получить логическое значение:

user> (boolean (resolve 'b)) 
true 

EDIT: за комментарий MayDaniel, это не совсем то, что вы просили, но он получит вас там. Вот реализация bounded? (вероятно, не лучшее название):

(defn bounded? [sym] 
    (if-let [v (resolve sym)] 
    (bound? v) 
    false)) 

user> (map bounded? ['a 'b 'c]) 
(true false false) 
+1

Ну, нет. 'b разрешен, но он не связан. Этого не интересует вопросник. – MayDaniel

+1

Вы правы. Пересмотрено –

+0

Я думаю, что было бы редко, что на самом деле нужно было бы «истина» и «ложь». Поскольку 'resolve' возвращает истинное значение, если символ привязан, и значение false,' nil', если оно несвязано, часто можно использовать 'resolve' как есть. '(if (resolve 'c)« Символ связан, чувак ».« Whaa? Этот символ несвязан! »)' – Mars

2

Можно использовать найти-вар для этого

(bound? (find-var 'user/y)) 
+0

Это возвращает исключение с нулевым указателем, если 'y' несвязано в' user', потому что 'find- var' возвращает 'nil' в этом случае. – Mars

Смежные вопросы