我并不是说这是一个主观问题 - 我试图理解为什么with-meta语言正是这样.我意识到它可以用于许多目的(也可以eval,但它在特定情况下的使用是坏设计的标志).从设计角度来看,Clojure的元数据结构有什么独特的用途?它主要用于文档吗?是糖吗?
什么是强大的应用程序with-meta/ meta?在什么情况下这是一个坏主意?你能举例说明如何使用元数据做一些不可能/困难/乏味的事情吗?
该语言的一些核心功能取决于元数据:
宏一个依赖于元数据的功能.宏是一个带有一点元数据的函数,它使函数在编译时运行.
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,当你使用元数据时,在屏幕底部显示函数参数.使用元数据不是一种设计气味,前提是你当然没有使用它来做丑陋的事情;)