2010-10-22 53 views
3

在爲Clojure的特殊形式的文檔(http://clojure.org/special_forms)爲:pre的例子,:post看起來是這樣的:歧義Clojure的屬性圖

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

的Clojure如何辨別是否包含元數據的地圖是不是函數的定義?元數據不應該在params矢量之前?根據用於defnhttp://clojure.github.com/clojure/clojure.core-api.html#clojure.core/defn)的文檔,語法是

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

attr-map?前PARAMS矢量。這是不是更正確的:

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

我應該提交一個錯誤報告或我誤解了這?

對不起,選擇尼特。

回答

5

該映射必須遵循參數向量,因爲它取決於參數。而且你可以有多個不同arities的函數體。 disambiguation非常簡單:地圖是體內唯一的東西,它是返回值。如果後面還有別的東西,地圖就會被扔掉。然後將其添加到元數據。這是一個非常簡單而且非常簡單的啓發式方法,不應該與任何生產代碼衝突。

+1

'defn'的文檔有錯嗎? – Ralph 2010-10-22 12:05:47

+1

@Ralph:沒有。 'defn'文檔討論了函數的元數據(實際上:包含該函數的Var)。條件轉到參數向量的元數據,而不是函數的元數據。正如我所說:條件取決於論據。將它們附加到函數本身沒有任何意義。 – kotarak 2010-10-22 12:22:25

+0

啊!我現在明白了。 ':pre'和':post'是'x'的值的前置和後置條件。當然,他們必須遵循。 – Ralph 2010-10-22 12:38:28