top | item 24432987

(no title)

gw | 5 years ago

I think the instrumenting and generator stuff gets disproportionate attention. For me by far the biggest win from spec has been with parsing. This completely changes how you'd write a library that takes a data structure and parses it into something meaningful (for example, what hiccup does for html or what honeysql does for sql).

In the past, this required a lot of very ugly parsing code and manual error-checking. With spec, you write specs and call s/conform. If it failed, you get a nice error, especially if you pair it with expound. If it succeeded, you get a destructured value that is really easy to pull data out of. I've done this in a half dozen different libraries and i'm pretty sure i wouldn't have even written them without spec.

discuss

order

adamkl|5 years ago

Totally agree with this.

I started playing with spec because of the idea of automated test generation, but the reality of it is that I use it as a super-charged validation library.

I think this emphasis actually does the library a disservice in that I see new users ask questions along the lines of "Should I use s/valid? to manually check inputs to my API"? The answer to that, in my usage, is "Yes! Of course!", but many people seem to think that they are using Spec wrong if they use it for something other than instrumentation and generation.

marxama|5 years ago

I remember doing just that - writing some ugly parsing code, thinking that I should be a good team member and add some specs for what I was doing, and when I tried calling conform... Oh, it did the parsing for me!

didibus|5 years ago

Yup, surprised the article doesn't mention parsing.

When writing complicated macros, Spec conforming is so useful!

stingraycharles|5 years ago

and if you then combine s/conform with core.match, you can build really elegant code to traverse these structures.

bgorman|5 years ago

Why not just pattern match immediately if you are going to bother with using core.match?

agumonkey|5 years ago

can you "stream" conform ? for UI live input

so that "john mcallister" yields { :name "john" :lastname "mcallister" } but "john " would yield { :name "john" :lastname nil } (or :todo even)

didibus|5 years ago

You could call it on every input change, though I'd say Spec conforming is not the most performant parsing library in the world, so not sure if it be fast enough for running it on each input.

Scarbutt|5 years ago

This is why languages like Ocaml are really nice to work with for this stuff.

didibus|5 years ago

Does OCaml have a good parsing DSL build in?