【发布时间】:2010-11-16 20:20:15
【问题描述】:
我想查看一个符号是否已被“def”,但我看不到任何 ifdef 语法
【问题讨论】:
标签: clojure
我想查看一个符号是否已被“def”,但我看不到任何 ifdef 语法
【问题讨论】:
标签: clojure
user> (resolve 'foo)
nil
user> (def foo 3)
#'user/foo
user> (resolve 'foo)
#'user/foo
【讨论】:
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
编辑:根据 MayDaniel 的评论,这并不完全符合您的要求,但它会让您到达那里。这是bounded? 的实现(可能不是最好的名称):
(defn bounded? [sym]
(if-let [v (resolve sym)]
(bound? v)
false))
user> (map bounded? ['a 'b 'c])
(true false false)
【讨论】:
true 和false。由于resolve 如果符号被绑定则返回一个真值,而一个假值nil,如果它未绑定,则通常可以按原样使用resolve。 (if (resolve 'c) "The symbol is bound, dude." "Whaa?? That symbol's unbound!")
可以为此使用 find-var
(bound? (find-var 'user/y))
【讨论】:
y 在user 中未绑定,则返回空指针异常,因为在这种情况下find-var 返回nil。