什么是Clojure的元数据的一些用途?(What are some uses of Clojure

2019-06-26 16:26发布

你是如何在你的Clojure程序使用的元数据?

只见从编程Clojure的一个例子:

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

都有些什么用途? 这种编程方式是完全新的给我。

Answer 1:

  • 文档字符串存储为下的元数据:DOC关键。 这可能是1号最明显的使用元数据。
  • 返回和参数类型可以用元数据来标记任选通过避免反射的类型在运行时的开销来提高性能。 这些也被称为“式的提示。” #^String是一种类型的提示。
  • 由编译器存储用于“引擎罩下”的东西,诸如函数,其中一个变种已定义,或者是否保持变种向宏基准的线号的arglist中。 这些通常由编译器自动加入,通常并不需要由用户直接操作。
  • 创建简单的测试用例作为函数定义的一部分:

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

    (test #'something)

如果你正在读编程Clojure的,那么第2章提供了一个很好的介绍,以元数据。 图2.3提供了通用的元数据的一个很好的概括。



Answer 2:

对于多样性的一些答案,不集中精力与语言本身的互动:

您也可以如。 跟踪一些数据的来源。 未经检验的输入被标记为:tainted 。 验证器可以检查东西,然后将状态设置为:clean 。 然后代码执行安全相关的事情可能BARF上:tainted和只接受:clean编辑输入。



Answer 3:

元数据是非常有用的,我打字的目的。 我说的不只是类型的提示,而是完整的定制型系统。 最简单的例子 - 超载对于结构的打印方法的(或任何其它变量):

(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验证功能,它可以提高安全性,并在同一时间,你的代码的灵活性非常非常(虽然这将需要更多的时间去做实际的编码)。

有关输入更多的想法看类型的API 。



Answer 4:

元数据被广泛地对于像存储对象的类型所使用的编译器。
你用这个当你给类型提示

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

我已经用它对于像存储已添加到许多填充量。 它适用于那就是“垂直”的数据,并决定如果值是相同的时,不应该被视为信息。



文章来源: What are some uses of Clojure metadata?