我并不是说这是一个主观问题 - 我试图理解为什么with-meta
语言正是如此。我意识到可以用于多种用途(eval
也可以使用,但在特定情况下使用它是错误设计的标志)。从设计的角度来看,Clojure的元数据结构有哪些唯一目的?它主要用于文档吗?是糖吗?
with-meta
/ meta
有哪些强大的应用?在什么情况下这是一个坏主意?你能举例说明使用元数据做一些不可能/困难/乏味的事情吗?
答案 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,当你使用元数据时,在屏幕底部显示函数参数。使用元数据并不是一种设计气味,前提是你没有使用元数据来做丑陋的事情;)