Clojure最佳实践:何时使用元数据?

时间:2014-04-15 19:57:43

标签: clojure

我并不是说这是一个主观问题 - 我试图理解为什么with-meta语言正是如此。我意识到可以用于多种用途(eval也可以使用,但在特定情况下使用它是错误设计的标志)。从设计的角度来看,Clojure的元数据结构有哪些唯一目的?它主要用于文档吗?是糖吗?

with-meta / meta有哪些强大的应用?在什么情况下这是一个坏主意?你能举例说明使用元数据做一些不可能/困难/乏味的事情吗?

1 个答案:

答案 0 :(得分:6)

该语言的一些核心功能取决于元数据:

  • 宏一个依赖于元数据的功能。宏是一个带有一点元数据的函数,它使函数在编译时运行。

    user> (meta #'when)
    
    {:macro true, 
     :ns #<Namespace clojure.core>, 
     :name when, :arglists ([test & body]), 
     :column 1, :added "1.0", 
     :doc "Evaluates test. If logical true, evaluates body in an implicit do.", 
     :line 471, 
     :file "clojure/core.clj"}
    
  • 类型是依赖于元数据的语言的另一个特性。某事物的类型表示为该对象的元数据。

  • 测试也使用元数据。当你(或lein)调用run-tests时,它会查看每个命名空间中函数的元数据,以找到那些是测试的元数据。

还有很多案例,从类型语言的核心到外围事物,如n-repl / cider,当你使用元数据时,在屏幕底部显示函数参数。使用元数据并不是一种设计气味,前提是你没有使用元数据来做丑陋的事情;)