У меня есть функция, которая начинается так:
(defn data-one [suser]
(def suser-first-name
(select db/firstNames
(fields :firstname)
(where {:username suser})))
(def suser-middle-name
(select db/middleNames
(fields :middlename)
(where {:username suser})))
(def suser-last-name
(select db/middleNames
(fields :lastname)
(where {:username suser})))
;; And it just continues on and on...
)
Конечно, мне это совсем не нравится. У меня есть этот шаблон, повторяющийся во многих областях моей кодовой базы, и я хотел бы обобщить это.
Итак, для начала я придумал следующее:
(def data-input {:one '[suser-first-name db/firstNames :firstname]
'[suser-middle-name db/middleNames :middlename]
'[suser-last-name db/lastNames :lastname]})
(defpartial data-build [data-item suser]
;; data-item takes the arg :one in this case
`(def (data-input data-item)
(select (data-input data-item)
(fields (data-input data-item))
(where {:username suser}))))
Тут действительно несколько вопросов:
-- Как я могу деконструировать ввод данных, чтобы он создавал функции x, когда x неизвестен, т.е. что значения :one неизвестны, и количество ключей во входных данных неизвестно.
-- Я думаю, что пришло время создать макрос, но я никогда раньше его не создавал, поэтому сомневаюсь в этой идее.
И чтобы дать небольшой контекст, функции должны возвращать значения для деконструкции, но я думаю, что как только я решу эту часть, можно будет обобщить все это:
(defpage "/page-one" []
(let [suser (sesh/get :username)]
(data-one suser)
[:p "Firat Name: "
[:i (let [[{fname :firstname}] suser-first-name]
(format "%s" fname))]
[:p "Middle Name: "
[:i (let [[{mname :emptype}] suser-middle-name]
(format "%s" mname))]
[:p "Last Name: "
[:i (let [[{lname :months}] suser-last-name]
(format "%s" lname))]]))