Esse é o primeiro texto daquela série que havia comentado do post anterior. Vou documentar o que aprendi e espero que seja útil para alguém.
Antes de falarmos de tipos, faz sentido começar com como definimos variáveis, funções e tudo mais. A palavra reservada para essa ação é a def. Ela cria o binding (perceba, binding e não atribuição) daquela variável. Agora temos o necessário para seguir.
Tipagem
Acho interessante começar comentando que clojure é uma linguagem de tipagem dinâmica ou seja, ela infere a tipagem de acordo com o dado que recebe. Exemplos:
1user=> (def um-numero 666)2#'user/um-numero34user=> (type um-numero)5//java.lang.Long678user=> (def uma-string "bavaria > budweiser")9#'user/uma-string1011user=> (type uma-string)12//java.lang.String
Clojure também tem tipagem forte, ou seja, o compilador não permitirá e nem fará procedimentos para que operações com tipos diferentes de dados aconteçam. Acho que o exemplo mais simples é tentar somar uma string e um número.
1user=> (+ 2 "11111")2Execution error (ClassCastException) at user/eval2023 (REPL:1).3class java.lang.String cannot be cast to class java.lang.Number (java.lang.String and java.lang.Number are in module java.base of loader 'bootstrap')
Tipagem forte é um dos pontos que durante meus anos codando variei entre gostar e não gostar. Hoje gosto bastante. Codar em uma linguagem de tipagem forte teria me poupado várias horas de dores de cabeça (alô php) e inconsistências (alô javascript).
Se compararmos o comportamento da mesma operação porém em linguagens de tipagem fraca, o problema fica bem evidente:
1//php2print(2 + "1111111");3// 1111113
1//js2console.log(2 + "1111111");3// 21111111
Tipos em Clojure
Clojure conta com três tipos numéricos, sendo eles: inteiros, decimais e racionais. Também há Strings, Booleans, Nil e Keywords. Acho que faz sentido dizer também que clojure consegue usar os tipos disponíveis na hosted language (que por padrão é java mas poderíamos ser javascript ou .net).
Acredito que por ora seja isso. Espero complementar esse artigo com mais detalhes futuramente. Um componente para o terminal também seria bem legal.
Abraços~