LionelGoulet
LionelGoulet

Reputation: 577

Can I avoid a second symbol lookup in Clojure resolve?

I need to do a lot of string-to-symbol-value processing, but some of the strings will not resolve to symbols. I have written the following (example) code to test to see if a given string resolves to a known symbol, before dereferencing the var to get the symbol's value.

(if (resolve (symbol "A")) @(resolve (symbol "A"))  ;; If the resolve of "A" works, deref it.
    false)                                          ;; If "A" doesn't resolve to a var, return false.

Maybe I think about things too much. I'm concerned about having to do the

(resolve (symbol "A"))

twice many times. Is there a clever way I can perform this "test-for-nil-and-deref-it-if-not," only once? Maybe a "safe" deref function that doesn't generate a runtime error when dereferencing nil? Or should I just not worry about performance in this code? Maybe the compiler's clever?

Upvotes: 2

Views: 87

Answers (1)

erdos
erdos

Reputation: 3528

You can try the when-let macro to only call deref when the result of resolve is present:

(when-let [resolved (resolve (symbol "A"))]
  @resolved)

Or a shorter version with some->:

(some-> "A" symbol resolve deref)

Upvotes: 4

Related Questions