次のように始まる関数があります。
(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 の値が不明であり、data-input のキーの数が不明であること。
――そろそろマクロを作ろうかなと思っているのですが、作ったことがないので迷っています。
少し説明すると、関数は分解される値を返す必要がありますが、この問題が解決されれば、これらすべてを一般化することが可能になると思います。
(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))]]))