0

私はこの機能を持っています:

 (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 が前提条件コードにバグを作成しています。これらの変数を関数の外に置いて機能させることができることを知っています。しかし、これらの定義を関数内に保持したいと思います。どうやってやるの?

4

2 に答える 2

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

一般に、予約済みdefでありdefn、トップレベルでの使用のみを目的としています。トップレベルの内部letは問題ありませんが、一般的ではありません。ただし、例のように関数本体内で使用しないでください。

于 2014-02-12T19:30:31.833 に答える
0

条件を間違えました。それらは、関数のパラメーター ベクトルの後に配置する必要があります。

(defn fun [param-1 param2]
{:pre  [ ]
 :post [ ]}
 ;; body goes here
)
于 2014-02-12T19:28:51.047 に答える