2010-10-22 9 views
3

Dans la documentation des formulaires spéciaux Clojure (http://clojure.org/special_forms) l'exemple pour :pre et :post ressemble à ceci:Ambiguïté Clojure attribut carte

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

Comment peut-Clojure dire si la carte contenant les méta-données ne sont pas la définition de la fonction? Les méta-données ne devraient-elles pas précéder le vecteur params? Selon la documentation defn (http://clojure.github.com/clojure/clojure.core-api.html#clojure.core/defn), la syntaxe est

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

avec le attr-map?avant le vecteur params. N'est-ce pas plus correct:

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

Devrais-je déposer un rapport de bogue ou est-ce que je le lis mal?

Désolé pour choisir lentes.

Répondre

5

La carte doit suivre le vecteur d'argument car cela dépend des arguments. Et vous pouvez avoir plusieurs corps de fonction avec des arités différentes. Le disambiguation est assez simple: la carte est la seule chose dans le corps, c'est la valeur de retour. S'il y avait autre chose qui le suivait, la carte serait jetée. Ajoutez-le ensuite aux métadonnées. C'est une heuristique très directe et assez simple qui ne devrait pas entrer en conflit avec un code de production.

+1

La documentation de 'defn' est-elle incorrecte? – Ralph

+1

@Ralph: non. Les docs 'defn' parlent des métadonnées de la fonction (en fait: le Var contenant la fonction). Les conditions vont aux métadonnées du vecteur d'argument, pas à celle de la fonction. Comme je l'ai dit: les conditions dépendent des arguments. Cela n'a aucun sens de les attacher à la fonction elle-même. – kotarak

+0

Ahh! Je vois maintenant. Les ': pre' et': post' sont des pré et post-conditions sur la valeur de 'x'. Bien sûr, ils doivent suivre. – Ralph