2017-01-15 15 views
7

clojure.spec'i denedim ve kullanmayı düşündüğüm bir fikir, belirttiğim haritanın bir örneğini düzenlemek için kullanıcı arayüzünü oluşturmaktır. Örneğin, bir tarih olması için belirtilen bir anahtar için bir tarih aralığı alanına sahip bir web formu oluşturabilir, bu tür bir şey.clojure.spec değerleri ile meta programming?

Kitaplıkta bir get-spec yöntemi var, ancak gereksinim duyduğum şekilde özellik-değerlerde çalışan hiçbir işlev yok gibi görünüyor. Bir harita spesifikasyonu almak ve bu harita için gerekli anahtarları bir vektör olarak geri almak gibi şeyler yapmanın bir yolu var mı? Bu tür clojure.spec kullanım durumu dışında spesifikasyonlara sahip bir metaprogramlama mıdır?

cevap

7

Spesifikasyonlarla metaprogramlama, kesinlikle clojure.spec'in kullanım amacı dahilindedir.

Henüz spesifikasyonlar için spesifikasyonlar yayınlamamış (ancak yazmış ve edindik) bilgiler yayınlamamıştır. Bunlar ile, bir spec formunun kendisinin uygun hale getirilmesi ve (örneğin) bir harita özelliğinden istenen anahtarları almak için kullanılabilen spesifikasyonu temsil eden bir veri yapısını geri almak mümkündür.

user=> (s/def ::name string?) 
:user/name 
user=> (s/def ::m (s/keys :req [::name])) 
:user/m 
user=> (s/conform ::spec (s/form ::m)) 
[:form {:s clojure.spec/keys, :args {:req [[:key :user/name]]}}] 

Daha sonra bu yapının dışına anahtarlar grubunu koparmak olabilir:

bir :: Spec spec ile Uyumlu bu gibi görünebilir.

+1

Harika, bunun planlı bir özellik olduğunu duyduğuma sevindim - Oldukça faydalı olabileceği bir dizi yolu düşünebilirim! –