Como informado anteriormente pelo InfoQ, a funcionalidade mais interessante na última versão do Clojure 1.9 é o Spec, que fornece um sistema padrão e integrado para a especificações e testes de dados e funções.
Aproveitando o trabalho em outros sistemas contratuais, como o Racket, Spec visa permitir validar automaticamente o código de Clojure, além de suportar várias tarefas, como testes generativos, relatórios de erros, desestruturação e muito mais. É assim que você pode especificar um mapa, usando especificações / chaves:
(spec/keys :req [::x ::y (or ::secret (and ::user ::pwd))]
:opt [::z])
As chaves usadas em uma especificação de mapa são algo remanescentes de união de etiquetas discriminadas como encontradas em outras linguagens, na medida em que você define seus tipos globalmente para um namespace:
(spec/def ::x integer?)
(spec/def ::y integer?)
(spec/def ::z integer?)
(spec/def ::secret string?)
Isso significa que a mesma especificação de tipo é aplicada a ocorrências de uma determinada chave em qualquer mapa definido no mesmo módulo. Se você quiser usar as chaves definidas em um namespace diferente, você pode usar a nova sintaxe de mapeamento no namespace:
#:types{ :x 1
:y 2
:secret "xyz" }
Isto é interpretado como:
{ :types/x 1
:types/y 2
:types/secret "xyz }
Enquanto o Clojure 1.9 já está em uma versão estável, Spec ainda está em uma versão alfa e as bibliotecas correspondentes devem ser incluídas manualmente. Ser alfa implica que a compatibilidade da API não é garantida.
Para aumentar a expressividade do Spec, o Clojure 1.9 adicionou vários predicados novos, incluindo booleano?, double?, simple-symbol e muitos mais. Ainda na frente da linguagem, clojure.core apresenta as seguintes novas funções:
- bounded-count, que permite contar os elementos de uma coleção sem que chegue em um determinado limite.
- swap-vals! and reset-vals!, duas novas funções atômicas que retornam o valor antigo e novo.
- halt-when, um transducer que termina a transdução quando um determinado predicado é satisfeito.
Clojure 1.9 também apresenta várias melhorias de performance, incluindo seq otimizado e desestruturação, cache de derivação de classe para acelerar a compilação e outros.
Clojure 1.9 pode ser instalado usando brew no macOS e um script de instalação no Linux. No Windows, você ainda precisa instalar o Leiningen ou o Boot.