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

gal*_*dre 11 clojure

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

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

Art*_*ldt 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"}
    
    Run Code Online (Sandbox Code Playgroud)
  • 类型是依赖于元数据的语言的另一个特征.某事物的类型表示为该对象的元数据.

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

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

  • 尊重@ArthurUlfeldt,这个答案缺少了肉!告诉我一些丑陋的事情? (6认同)