Clojure属性映射中的歧义

时间:2010-10-22 11:27:12

标签: clojure

在Clojure特殊表单(http://clojure.org/special_forms)的文档中,:pre:post的示例如下所示:

(defn constrained-sqr [x]
    {:pre  [(pos? x)]
     :post [(> % 16), (< % 225)]}
    (* x x))

Clojure如何判断包含元数据的地图是否不是函数的定义?元数据不应该在params向量之前吗?根据{{​​1}}(http://clojure.github.com/clojure/clojure.core-api.html#clojure.core/defn)的文档,语法为

defn

使用(defn name doc-string? attr-map? [params*] body) 之前参数向量。这不是更正确的:

attr-map?

我应该提交错误报告还是我误读了这个?

很抱歉选择尼特。

1 个答案:

答案 0 :(得分:5)

地图必须遵循参数向量,因为它取决于参数。并且您可以拥有多个具有不同arities的函数体。 disambiguation非常简单:地图是身体中唯一的东西,它是返回值。如果其后还有其他内容,那么地图就会被丢弃。然后将其添加到元数据中。这是一个非常直接且非常简单的启发式方法,不应该与任何生产代码冲突。