yazz.com
yazz.com

Reputation: 58786

In clojure how can I test if a a symbol has been defined?

I would like to see if a symbol has been "def" ed, but I can't see any ifdef syntax

Upvotes: 24

Views: 4057

Answers (3)

justinhj
justinhj

Reputation: 11306

Can use find-var for this

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

Upvotes: 4

Justin Kramer
Justin Kramer

Reputation: 4003

resolve or ns-resolve may do what you're looking for:

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

To get a boolean:

user> (boolean (resolve 'b))
true

EDIT: per MayDaniel's comment, this isn't exactly what you asked for, but it will get you there. Here's an implementation of bounded? (probably not the best name):

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

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

Upvotes: 8

Michiel Borkent
Michiel Borkent

Reputation: 34840

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

Upvotes: 29

Related Questions