【问题标题】:Ambiguity in Clojure attribute mapClojure 属性映射中的歧义
【发布时间】:2010-10-22 11:27:11
【问题描述】:

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

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

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

(defn name doc-string? attr-map? [params*] body)

与attr-map? 之前参数向量。这不是更正确吗:

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

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

对不起,挑剔。

【问题讨论】:

  • attr-map 与 prepost-map 不同。这在多参数函数中更有意义,其中前置条件可能因一个参数而异。 attr-map 元数据出现在函数被拆分为单独的 arities 之前,因此元数据同样适用于所有不同的 arities。

标签: clojure


【解决方案1】:

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

【讨论】:

  • @Ralph:没有。 defn 文档讨论了函数的元数据(实际上是:包含函数的 Var)。条件转到参数向量的元数据,而不是函数的元数据。正如我所说:条件取决于论点。将它们附加到函数本身是没有意义的。
  • 啊!我现在明白了。 :pre 和 :post 是 x 值的前置条件和后置条件。当然,他们必须跟随。
  • @Ralph:没错。考虑一下(假设的):(defn foo {:pre [(pos? y)]} ([x] ...) ([x y] ...)) 如果我打电话给(foo 1),会发生什么?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-06
  • 1970-01-01
  • 1970-01-01
  • 2012-03-03
相关资源
最近更新 更多