Clojure元数据有哪些用途?

时间:2009-07-24 00:38:12

标签: functional-programming clojure metadata

您如何在Clojure计划中使用元数据?

我在 Programming Clojure 中看到了一个例子:

(defn shout [#^{:tag String} message] (.toUpperCase message))
;; Clojure casts message to String and then calls the method.

有什么用途?这种编程形式对我来说是全新的。

4 个答案:

答案 0 :(得分:26)

  • 文档字符串作为元数据存储在:doc键下。这可能是元数据最明显使用的第一个。
  • 可以选择使用元数据标记返回和参数类型,以避免在运行时反映类型的开销,从而提高性能。这些也被称为“类型提示”。 #^String是类型提示。
  • 存储“引擎盖下”以供编译器使用,例如函数的arglist,已定义var的行号,或者var是否包含对宏的引用。这些通常由编译器自动添加,通常不需要由用户直接操作。
  • 创建简单的测试用例作为函数定义的一部分:

    (defn #^{:test (fn [] (assert true))} something [] nil)

    (test #'something)

如果您正在阅读Programming Clojure,那么第2章提供了一个很好的元数据介绍。图2.3提供了常见元数据的一个很好的总结。

答案 1 :(得分:16)

对于多样性的一些答案,它不专注于与语言本身的交互:

你也可以。跟踪一些数据的来源。未选中的输入标记为:tainted。验证器可能会检查事物,然后将状态设置为:clean。执行安全相关事项的代码可能会在:tainted上进行关注并且仅接受:clean输入。

答案 2 :(得分:5)

元数据对于我来说非常有用。我说的不只是类型提示,而是关于完整的自定义类型系统。最简单的例子 - 为结构(或任何其他var)重载print-method:

(defstruct my-struct :foo :bar :baz)

(defn make-my-struct [foo bar baz]
   (with-meta (struct-map my-struct :foo foo :bar baz :baz baz)
      {:type ::my-struct}))


(defmethod print-method 
   [my-struct writer]
   (print-method ...))

通常,与Clojure验证功能一起,它可以提高安全性,同时提高代码的灵活性(尽管实际编码需要更多时间)。

有关输入的更多提示,请参阅types-api

答案 3 :(得分:1)

编译器广泛使用

元数据来存储对象的类型 在提供类型提示时使用它

(defn foo [ #^String stringy] ....

我已将它用于存储添加到数字中的填充量等内容。它用于与数据“正交”的信息,在决定您的值是否相同时不应考虑。