Hi there,

I have been playing a little bit with clojure.spec and I find it a very 
nice addition to the core language.
One thing I am particularly interested in is the spec of recursive 
structures, but I noticed there
 is no dedicated support for these (especially mutually recursive 
structures).

As a toy example, I have encoded a spec for constructive even/odd numbers.

;; ==============
(:require [clojure.spec :as s]))
(s/def ::zero #{:zero})
(s/def ::one #{:one})
(s/def ::succ #{:succ})
(s/def ::odd nil)
(s/def ::even (s/or :zero ::zero   ; 0 is even
                          :even (s/tuple ::succ ::odd)))  ; n+1 is even if 
n is odd
(s/def ::odd (s/tuple ::succ ::even)) ; n+1 is odd if n is even
;; ==================

First question : is there a better way to define a set of mutually 
recursive specs ?

This seems to work anyways :

;; ===================
(s/conform ::even :zero) ; zero is even
;; => [:zero :zero]
(s/conform ::even [:succ [:succ :zero]]) ; 2 is even
;; => [:even [:succ [:succ [:zero :zero]]]]

(s/exercise ::even)
;; => generates 10 even numbers  (nice !)
(s/conform ::odd [:succ :zero]) ; 1 is odd
;; => [:succ [:zero :zero]]
(s/conform ::odd [:succ [:succ :zero]]) ; 2 is not odd
;; => :clojure.spec/invalid
;; ======================

My main concern is when asking for some explanations for invalid data.

;; ========================================
(s/explain ::odd [:succ [:succ :zero]])
;; In: [1] val: [:succ :zero] fails spec: :typetheory.syntax/zero at: [1 
:zero] predicate: #{:zero}
;; In: [1 1] val: :zero fails spec: :typetheory.syntax/odd at: [1 :even 1] 
predicate: vector?
;; => nil
;; ========================================

I think the explanation will be of a size as long as the length of the 
input data,
 and moreover it is not easy to understand what is the problem...

so, my second question : is there a way to get a better explanation ?

Cheers,
Frederic.

-- 
Frederic Peschanski
UPMC - LIP6 - Complex. - APR

-- 
You received this message because you are subscribed to the Google
Groups "Clojure" group.
To post to this group, send email to clojure@googlegroups.com
Note that posts from new members are moderated - please be patient with your 
first post.
To unsubscribe from this group, send email to
clojure+unsubscr...@googlegroups.com
For more options, visit this group at
http://groups.google.com/group/clojure?hl=en
--- 
You received this message because you are subscribed to the Google Groups 
"Clojure" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to clojure+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to