clojure:函数中定义的变量正在破坏前提条件

clojure:函数中定义的变量正在破坏前提条件,clojure,var,preconditions,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 tra

我有这个功能:

 (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。
我知道我可以把这些变量放在我的功能之外,让它工作。但是我想在我的函数中保留这些定义。我该怎么做呢?

你把条件放错地方了。它们应该跟踪函数的参数向量

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

你把条件放错地方了。它们应该跟踪函数的参数向量

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

为了识别前置和后置条件映射,它必须立即跟随参数向量。看

一种可以接受但不是很常见的打包方式是将
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))]
     ...

一般来说,保留
def
defn
仅供顶级使用。在顶级
中,让
也可以,但同样不常见。但是,绝对不要像您的示例中那样在函数体内部使用。

为了识别前置和后置条件映射,它必须立即跟随参数向量。看

一种可以接受但不是很常见的打包方式是将
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))]
     ...

一般来说,保留
def
defn
仅供顶级使用。在顶级
中,让
也可以,但同样不常见。但是,绝对不要像您的示例中那样在函数体内部使用。

为什么要在函数内部定义变量?这被认为不是一个好的实践。为什么要在函数中定义变量?这被认为是不好的做法。