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



我有这个函数:

(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比索在前置条件代码中创建了一个错误。我知道我可以把这些变量放在我的函数之外,让它发挥作用。但我希望将这些定义保留在我的函数中。我该怎么做?

为了将前置和后置条件映射识别为这样,它必须立即跟随参数向量。看见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内部是可以的,但同样不常见。但是,绝对不要像你的例子那样在函数体内部使用。

您放错了条件的位置。它们应该在函数的参数向量之后。

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

最新更新