Records em Clojure


Records são uma alternativa aos mapas, projetados especificamente para representar dados de domínio com campos pré-definidos.

  • Performance: Records geralmente possuem melhor desempenho que mapas comuns para acesso e armazenamento de campos fixos.
  • Polimorfismo: Diferente dos mapas, os Records possuem um “tipo” nomeado, o que permite comportamentos polimórficos na linguagem.

Utiliza-se a macro defrecord para especificar os nomes dos campos, que serão tratados internamente como chaves de keyword.

(defrecord Person [first-name last-name age occupation])

Construtores

Clojure gera automaticamente dois tipos de construtores para cada Record:

Posicional:

(def kelly (->Person "Kelly" "Keen" 32 "Programmer"))

Via Mapa:

(def kelly (map->Person {:first-name "Kelly" ...}))

Restrição

Embora possam ser acessados como mapas (ex: (:age kelly)), os Records não podem ser invocados como funções, diferentemente dos mapas.

Referências


https://clojure.org/guides/learn/hashed_colls#_records