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

Car*_*nes 0 var clojure 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))]
   ...
Run Code Online (Sandbox Code Playgroud)

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

A. *_*ebb 5

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

虽然不是很常见的方法来打包这些将是包装你defnlet

 (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))]
     ...
Run Code Online (Sandbox Code Playgroud)

一般而言,仅限预留defdefn顶级使用.在顶级内部let是可以的,但同样,不常见.但是,绝对不要像在你的例子中那样在函数体内部使用.