clojure:在函数内部定义的var是破坏前提条件

时间:2014-02-12 19:18:12

标签: clojure var preconditions

我有这个功能:

 (defn executa-peso-individuo 
   [estado-individuo transicao-individuo]
   (def tipos-transicoes-peso #{:troca-peso :mesmo-peso})
   (def tipos-estados-peso #{:d :e})
   {:pre [(contains? tipos-transicoes-peso
                     (:peso transicao-individuo))
          (contains? tipos-estados-peso
                     (:peso estado-individuo))]
   ...

先决条件不起作用。不知何故,vars tipos-transicoes-pes和tipos-estados-peso在前置条件代码中创建了一个bug。 我知道我可以将这些变量放在我的功能之外以使其工作。但我想将这些定义保留在我的功能中。我怎么能这样做?

2 个答案:

答案 0 :(得分:5)

为了使条件前和后条件图像被识别,它必须紧跟参数向量。请参阅http://clojure.org/special_forms#toc10

尽管不是很常见的打包方法,但是将defn包裹在let

 (let [tipos-transicoes-peso #{:troca-peso :mesmo-peso}
       tipos-estados-peso #{:d :e}]
   (defn executa-peso-individuo 
     [estado-individuo transicao-individuo]
     {:pre [(contains? tipos-transicoes-peso
                       (:peso transicao-individuo))
            (contains? tipos-estados-peso
                       (:peso estado-individuo))]
     ...

一般情况下,仅为顶级使用保留defdefn。在顶级let内是可以的,但同样,不常见。但是,绝对不要像在你的例子中那样在函数体内部使用。

答案 1 :(得分:0)

你放错了条件。他们应该追求函数的param向量。

(defn fun [param-1 param2]
{:pre  [ ]
 :post [ ]}
 ;; body goes here
)