【问题标题】:clojure: var defined inside function is breaking preconditionclojure:在函数内部定义的 var 打破了先决条件
【发布时间】:2014-03-11 08:15:55
【问题描述】:

我有这个功能:

 (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))]
   ...

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

【问题讨论】:

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

标签: clojure var preconditions


【解决方案1】:

你放错了条件。他们应该关注函数的参数向量。

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2018-07-31
      • 1970-01-01
      • 2012-07-12
      • 2023-03-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-25
      • 2012-10-04
      相关资源
      最近更新 更多