defn定义的clojure函数的attr-map是什么?

时间:2014-04-08 13:26:23

标签: clojure ring

作为一名clojure初学者,我正在阅读clojure代码,以熟悉Clojure的语法。 下面的代码片段是Ring项目中的一个函数

(defn- request-context
"Create an UploadContext object from a request map."
{:tag UploadContext}
[request encoding]
(reify UploadContext
(getContentType [this]       (get-in request [:headers "content-type"]))
(getContentLength [this]     (or (req/content-length request) -1))
(contentLength [this]        (or (req/content-length request) -1))
(getCharacterEncoding [this] encoding)
(getInputStream [this]       (:body request))))

我不清楚的是行

{:tag UploadContext}

如果查看clojure函数的定义

(defn function-name doc-string? attr-map? [parameter-list]
conditions-map?
(expressions))

我猜(但不确定)地图应该是" attr-map?"。但是什么是" attr-map?"?我用谷歌搜索,找不到好的解释。

介绍" attr-map的任何示例或链接?"将不胜感激。我也想知道如何在我粘贴的代码中使用attr-map。

1 个答案:

答案 0 :(得分:3)

将(可选)attr-map?传递给defn是将元数据添加到函数变量的简便方法。

元数据可能包括:tag(运行时返回类型),:doc(文档字符串)和:private等条目(用于指示var是否为命名空间专用)。其他元数据也可以附加在那里,但应该用于"与数据的逻辑值正交的数据" (引自http://clojure.org/functional_programming

(defn greet {:tag String :other-meta-data 5} [name] (format "Hello, %s" name))

(meta #'f)
;=> {:arglists ([name]), :ns #<Namespace user>, :name f, :end-column 8, :column 1,
     :line 4 :other-meta-data 5, :file "NO_SOURCE_FILE", :end-line 4, 
     :tag java.lang.String}