Translate

viernes, 19 de febrero de 2021

Primeros pasos con Clojure, parte 25

Seguimos con Clojure... 

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"}}