【问题标题】:In clojure how can I test if a a symbol has been defined?在 clojure 中,我如何测试是否已定义符号?
【发布时间】:2010-11-16 20:20:15
【问题描述】:

我想查看一个符号是否已被“def”,但我看不到任何 ifdef 语法

【问题讨论】:

    标签: clojure


    【解决方案1】:
    user> (resolve 'foo)
    nil
    user> (def foo 3)
    #'user/foo
    user> (resolve 'foo)
    #'user/foo
    

    【讨论】:

      【解决方案2】:

      resolvens-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)
      

      【讨论】:

      • 嗯,不。 'b 已解决,但未绑定。这不是提问者想要的。
      • 我认为很少有人真正需要truefalse。由于resolve 如果符号被绑定则返回一个真值,而一个假值nil,如果它未绑定,则通常可以按原样使用resolve(if (resolve 'c) "The symbol is bound, dude." "Whaa?? That symbol's unbound!")
      【解决方案3】:

      可以为此使用 find-var

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

      【讨论】:

      • 如果yuser 中未绑定,则返回空指针异常,因为在这种情况下find-var 返回nil
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-11-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-30
      相关资源
      最近更新 更多