Rov*_*ion 5 clojure clojure.spec
让我们考虑针对打嗝语法的Clojure Spec正则表达式
(require '[clojure.spec :as spec])
(spec/def ::hiccup
(spec/cat :tag keyword?
:attributes (spec/? map?)
:content (spec/* (spec/or :terminal string?
:element ::hiccup))))
Run Code Online (Sandbox Code Playgroud)
这非常有效
(spec/conform ::hiccup [:div#app [:h5 {:id "loading-message"} "Connecting..."]])
; => {:tag :div#app, :content [[:element {:tag :h5, :attributes {:id "loading-message"}, :content [[:terminal "Connecting..."]]}]]}
Run Code Online (Sandbox Code Playgroud)
直到您尝试从规范生成函数的一些示例数据
(require '[clojure.spec.gen :as gen])
(gen/generate (spec/gen ::hiccup))
; No return value but:
; 1. Unhandled java.lang.OutOfMemoryError
; GC overhead limit exceeded
Run Code Online (Sandbox Code Playgroud)
有没有办法重写规范,以便生成一个工作的生成器?或者我们是否必须在规范中附加一些简化的生成器?
(默认 4)的目的spec/*recursion-limit*
是限制递归生成,使其能够正常工作。*
因此,要么在其中一个规范实现(或)中无法正常工作or
,要么您看到其他东西(例如map?
或字符串)快速增长。如果不进行一些修补,就很难知道哪个是问题所在。
这确实为我生成了(一个非常大的例子):
(binding [spec/*recursion-limit* 1] (gen/generate (spec/gen ::hiccup)))
Run Code Online (Sandbox Code Playgroud)
即使在该示例中,我也确实看到了基数很大的几个区域 -*
生成的属性的大小和大小map?
。这两者都可能受到进一步限制。最简单的方法是将这些部分进一步分解为更细粒度的规范,并在必要时提供覆盖生成器(属性映射可以仅使用 和 进行处理map-of
):gen-max
。
归档时间: |
|
查看次数: |
663 次 |
最近记录: |