正如InfoQ之前報道的,最近發布的Colojure 1.9中最有趣的新特性是Spec,它為數據和函數的規范和測試提供了一個標準化集成系統。
考慮到之前其它的合同系統(contract systems)所做的工作,比如說Racket,Spec的目標是使Clojure代碼的自動驗證成為可能,同時還要支持其它功能,比如生成測試、錯誤報告、代碼析構等等。下面這個例子向你展示了你該如何通過使用spec/keys來規范化一個map:
(spec/keys :req [::x ::y (or ::secret (and ::user ::pwd))] :opt [::z])在map規范中使用的key在某種程度上讓人想起了在其他語言中受歧視的union標簽,因為在全局的命名空間中定義了它們的類型:
(spec/def ::x integer?)(spec/def ::y integer?)(spec/def ::z integer?)(spec/def ::secret string?)這就意味著,在同一模塊中定義的任何map中,相同的類型規范都會被應用到出現的給定key上。如果您想要使用在不同命名空間中定義的key,那么可以使用新的map命名空間語法:
#:types{ :x 1 :y 2 :secret "xyz" }這會被解釋為:
{ :types/x 1 :types/y 2 :types/secret "xyz }雖然現在Clojure 1.9是一個穩定版本,但是Spec仍然處于alpha測試階段,并且要使用它必須要引入相應的庫文件。處于alpha階段意味著不能保證其API的兼容性。
為了提升Spec的表達能力,Clojure 1.9提供了許多新的斷言(predicates),包括boolean?、 double?、simple-symbol等等。在編程語言方面,clojure.core引入了下列新的函數:
bounded-count:它能夠對集合中的元素進行計數,并且不需要在集合邊界外進行實現。 swap-vals! 和 reset-vals!:這是兩個新的原子(atomic)函數,它們能夠返回舊的和新的數值。 halt-when:它是一個transducer(推導式),當給定的斷言(predicates)被滿足時會結束推導。Clojure 1.9還引入了許多性能的提升,包括對seq的優化以及析構、通過對派生類的緩存加速編譯等等。
在Mac上可以通過brew來安裝Clojure 1.9,在Linux可以用安裝腳本進行安裝。在Windows上,你仍然需要安裝Leiningen或Boot。
查看英文原文:Clojure 1.9 Brings Spec and More Language Features