你是如何在你的Clojure程序使用的元数据?
只见从编程Clojure的一个例子:
(defn shout [#^{:tag String} message] (.toUpperCase message))
;; Clojure casts message to String and then calls the method.
都有些什么用途? 这种编程方式是完全新的给我。
你是如何在你的Clojure程序使用的元数据?
只见从编程Clojure的一个例子:
(defn shout [#^{:tag String} message] (.toUpperCase message))
;; Clojure casts message to String and then calls the method.
都有些什么用途? 这种编程方式是完全新的给我。
#^String
是一种类型的提示。 创建简单的测试用例作为函数定义的一部分:
(defn #^{:test (fn [] (assert true))} something [] nil)
(test #'something)
如果你正在读编程Clojure的,那么第2章提供了一个很好的介绍,以元数据。 图2.3提供了通用的元数据的一个很好的概括。
对于多样性的一些答案,不集中精力与语言本身的互动:
您也可以如。 跟踪一些数据的来源。 未经检验的输入被标记为:tainted
。 验证器可以检查东西,然后将状态设置为:clean
。 然后代码执行安全相关的事情可能BARF上:tainted
和只接受:clean
编辑输入。
元数据是非常有用的,我打字的目的。 我说的不只是类型的提示,而是完整的定制型系统。 最简单的例子 - 超载对于结构的打印方法的(或任何其它变量):
(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 。
元数据被广泛地对于像存储对象的类型所使用的编译器。
你用这个当你给类型提示
(defn foo [ #^String stringy] ....
我已经用它对于像存储已添加到许多填充量。 它适用于那就是“垂直”的数据,并决定如果值是相同的时,不应该被视为信息。