作为一名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。
答案 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}