Trato específicamente de generar la plantilla para que las funciones crud funcionen con el almacén de datos de Google App Engine utilizando appengine-magic en Clojure. Tengo dificultades para generar valores a partir de un modelo que he reproducido a continuación.Uso de macros en Clojure
(def *model* {:users [{:name "Adam"
:email "[email protected]"
:registered-on "07-05-2011"}
{:name "Greg"
:email "[email protected]"
:registered-on "11-05-2011"}]
:post [{:title "A"
:authour "Adam"}
{:title "B"
:author "Greg"}]})
Soy bastante nuevo a AppEngine-magia, sino que proporciona un defentity que le permite definir las entidades que se pueden poner en el almacén de datos y guardar! que le permite guardar entidades predefinidas en el almacén de datos.
Éstos toman la forma de:
(ds/defentity Post [title author])
(ds/save! (Post. title author))
Ahora acaba de empezar con he definido:
(defn list-entities [model]
"Takes a representation of the model and lists the entities in preparation for generating defentities"
(interleave (vec (map first (partition 1 (map (comp symbol capitalize #(str % ".") name) (keys model)))))
(map vec (map keys (map first (vals model))))))
Llamando con:
(list-entities *model*)
Salidas:
(Users. [:name :email :registered-on] Post. [:title :author])
Ahora estoy teniendo dificultades para definir gen-entidades que tomarán el resultado anterior y llamo repetidamente a ds/defentities para definir tantas entidades como requiera mi modelo.
(defmacro gen-entities [entity fields]
`(ds/defentity 'entity 'fields))
Además, de ninguna manera estoy seguro de que este sea un modo razonable de resolver este problema. Todavía soy muy nuevo en macros y probablemente cometo varios errores. Cualquier ayuda/claridad sería apreciada.
NOTA:
Ese modelo me he dado cuenta está mal diseñado, la de abajo es mucho mejor:
(def *model* {:users [:name :email :registered-on]
:post [:title :author]})
Sin embargo es más complejo en términos de escribir una macro así que voy a dejar como es.
¿Por qué no querría hacer una función que transforme la entrada en llamadas a ds/defentity directamente? La única razón por la que necesita macros aquí es debido a la salida que genera su función. – Gert
Bueno, me podría estar perdiendo algo aquí, lo intenté y parece que no funciona. Así que pensé que este era un caso en el que tendría que usar macros. Soy consciente de que no deberíamos usarlos a menos que lo necesitemos, así que pensé en preguntar aquí al respecto. – toofarsideways