gpt4 book ai didi

Clojure:从映射动态创建函数——是时候使用宏了?

转载 作者:行者123 更新时间:2023-12-02 21:14:50 25 4
gpt4 key购买 nike

我有一个这样开头的函数:

(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))]]))

最佳答案

一些建议:

    函数内的
  • def确实令人讨厌 - 您正在改变全局环境,并且它可能会导致各种并发问题。我建议将结果存储在 map 中。
  • 这里不需要宏 - 所有数据获取都可以在函数内相对轻松地完成

因此我建议:

(def data-input [[:suser-first-name db/firstNames :firstname] 
[:suser-middle-name db/middleNames :middlename]
[:suser-last-name db/lastNames :lastname]])

(def data-build [data-input suser]
(loop [output {}
items (seq data-input)]
(if items
(recur
(let [[kw db fieldname] (first items)]
(assoc output kw (select db (fields fieldname) (where {:username suser}))))
(next items))
output)))

未经测试,因为我没有您的数据库设置 - 但希望这能让您了解如何在没有宏或可变全局变量的情况下执行此操作!

关于Clojure:从映射动态创建函数——是时候使用宏了?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12654919/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com