我可以避免在 Clojure resolve 中进行第二次符号查找吗?

Can I avoid a second symbol lookup in Clojure resolve?

我需要做很多字符串到符号值的处理,但有些字符串不会解析为符号。在取消引用 var 以获取符号的值之前,我编写了以下(示例)代码来测试给定字符串是否解析为已知符号。

(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.

可能是我想太多了。我担心必须做

(resolve (symbol "A"))

两次。有没有一种聪明的方法可以让我只执行一次这个“test-for-nil-and-deref-it-if-not”?也许是一个“安全”的取消引用函数,在取消引用 nil 时不会产生运行时错误?还是我不应该担心这段代码的性能?也许编译器很聪明?

您可以尝试 when-let 宏仅在出现 resolve 的结果时调用 deref:

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

some-> 的较短版本:

(some-> "A" symbol resolve deref)