clojure spec - 验证地图的内容

时间:2017-03-01 11:25:30

标签: clojure clojure.spec

我想为地图创建一个clojure规范,其中包含有关特定键的存在的规则。

地图必须为:type,并且可以包含:default:value,但不能同时包含(s/def ::propertyDef (s/keys :req [::type (s/or ::default ::value) ] :opt [::description ::required])) CompilerException java.lang.AssertionError: Assert failed: spec/or expects k1 p1 k2 p2..., where ks are keywords (c/and (even? (count key-pred-forms)) (every? keyword? keys)), compiling:(C:\Users\MartinRoberts\AppData\Local\Temp\form-init4830956164341520551.clj:1:22) 。我试过了:

or

但我得到了

s/or

但是#include <string> auto& make_entry(std::string& cell, int index) { cell += '('; cell += char('A' + index); cell += ')'; return cell; } int main() { std::string battlefield[10][1]; for (int i = 0; i < 10; i++){ make_entry(battlefield[i][0], i); } } 给了我一个错误,因为格式错误。我不得不承认在function berekeningAflostabel() { var zaaksoortMsnp; var AflostabelPerMaand; document.getElementById("fldZaakSoortMsnp").addEventListener("change", function () { AflostabelPerMaand = this.value; if(AflostabelPerMaand == 1) { zaaksoortMsnp = "Tekst1"; } if(AflostabelPerMaand == 2) { zaaksoortMsnp = "Tekst2"; } if(AflostabelPerMaand == 3) { zaaksoortMsnp = "Tekst3"; } if(AflostabelPerMaand == 4) { zaaksoortMsnp = "Tekst4"; } if(AflostabelPerMaand == 5) { zaaksoortMsnp = "Tekst5"; } if(AflostabelPerMaand == 6) { zaaksoortMsnp = "Tekst6"; } document.getElementById("fldMinimaleAfloswaardePerMaand").value = zaaksoortMsnp; } } var eventZaaksoortMsnp = document.getElementById("fldZaakSoortMsnp"); eventZaaksoortMsnp.addEventListener("change", berekeningAflostabel); 的文档中没有真正理解。

1 个答案:

答案 0 :(得分:4)

首先:您使用s/or在所需密钥列表中指定::default::values/or需要:label spec对,并且您只提供规格本身,这是错误的原因。

要解决,只需使用or代替:

(s/def ::propertyDef (s/keys :req [::type (or ::default ::value)]
                             :opt [::description ::required]))

这允许::default::value都出现在地图中,但这几乎总是好的。实际使用地图的代码可以简单地检查是否存在::value并使用它,如果它不存在,则使用::default(或者您的逻辑恰好是什么)。这通常是这样做的:

(let [myvalue (or (::value mymap) (::default mymap))] ...)

地图中可能有数千个键,这不会影响您提取所需键的能力。这就是为什么规范没有提供内置的方法来指定不应该在地图中的键,只能指定应该存在哪些键(即:req和{{在:req-un)中的1}}。想想大多数http服务器的工作方式:你可以给他们荒谬的标题密钥和值,但他们不会拒绝为请求提供服务;他们只是忽略它们并返回回复。

因此,您可能不需要强制执行只有一个或另一个存在,但如果必须,您可以定义一个独占或功能:

s/keys

然后将其添加为规范的附加谓词:

(defn xor
  [p q]
  (and (or p q)
       (not (and p q))))