Cuando necesitemos representar mucha información de dominio con el mismo conjunto de campos conocidos de antemano, se puede utilizar un mapa con nombre de atributos como claves. Algo así :
(def person
{:first-name "Kelly"
:last-name "Keen"
:age 32
:occupation "Programmer"})
Dado que se trata de un mapa, las formas que ya hemos analizado para buscar un valor por clave también funcionan:
user=> (get person :occupation)
"Programmer"
user=> (person :occupation)
"Programmer"
Pero realmente, la forma más común de obtener valores de campo para este uso es invocando la palabra clave. Al igual que con los mapas y conjuntos, las palabras clave también son funciones. Cuando se invoca una palabra clave, se busca a sí misma en la estructura de datos asociativa que se le pasó.
user=> (:occupation person)
"Programmer"
La invocación de palabras clave también toma un valor predeterminado opcional:
user=> (:favorite-color person "beige")
"beige"
Como se trata de un mapa, podemos usar assoc para agregar o modificar campos:
user=> (assoc person :occupation "Baker")
{:age 32, :last-name "Keen", :first-name "Kelly", :occupation "Baker"}
Y dissoc para eliminar campos:
user=> (dissoc person :age)
{:last-name "Keen", :first-name "Kelly", :occupation "Programmer"}
Es común ver entidades anidadas dentro de otras entidades:
(def company
{:name "WidgetCo"
:address {:street "123 Main St"
:city "Springfield"
:state "IL"}})
Puede usar get-in para acceder a los campos en cualquier nivel dentro de las entidades anidadas:
user=> (get-in company [:address :city])
"Springfield"
También puede utilizar assoc-in o update-in para modificar entidades anidadas:
user=> (assoc-in company [:address :street] "303 Broadway")
{:name "WidgetCo",
:address
{:state "IL",
:city "Springfield",
:street "303 Broadway"}}