代码之家  ›  专栏  ›  技术社区  ›  yazz.com

在clojure中,如何测试是否定义了符号?

  •  22
  • yazz.com  · 技术社区  · 14 年前

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

    3 回复  |  直到 14 年前
        1
  •  28
  •   Michiel Borkent    14 年前
    user> (resolve 'foo)
    nil
    user> (def foo 3)
    #'user/foo
    user> (resolve 'foo)
    #'user/foo
    
        2
  •  8
  •   Justin Kramer    13 年前

    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
    

    编辑:根据梅丹尼尔的评论,这并不完全是你想要的,但它会让你达到目的。这里有一个实现 bounded? (可能不是最好的名字):

    (defn bounded? [sym]
      (if-let [v (resolve sym)]
        (bound? v)
        false))
    
    user> (map bounded? ['a 'b 'c])
    (true false false)
    
        3
  •  3
  •   justinhj    13 年前

    可以为此使用find var

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