gpt4 book ai didi

macros - 在 Clojure 中使用宏

转载 作者:行者123 更新时间:2023-12-04 16:01:42 25 4
gpt4 key购买 nike

我特别尝试使用 Clojure 中的 appengine-magic 为 crud 函数生成样板,以便与 Google App Engine 数据存储区配合使用。我很难弄清楚如何从我在下面复制的模型中生成值。

(def *model* {:users [{:name "Adam"
:email "adam@gmail.com"
:registered-on "07-05-2011"}
{:name "Greg"
:email "gregory@gmail.com"
:registered-on "11-05-2011"}]
:post [{:title "A"
:authour "Adam"}
{:title "B"
:author "Greg"}]})

我对 appengine-magic 还很陌生,但它提供了一种防御机制,允许您定义可以放入数据存储区并保存的实体!它允许您将预定义的实体保存到数据存储中。

这些采取以下形式:
(ds/defentity Post [title author])
(ds/save! (Post. title author))

现在只是开始我已经定义:
(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))))))

调用它:
(list-entities *model*)

输出:
(Users. [:name :email :registered-on] Post. [:title :author])

现在我很难定义 gen-entities,它将采用上面的输出并重复调用 ds/defentities 来定义我的模型所需的尽可能多的实体。
(defmacro gen-entities [entity fields]
`(ds/defentity 'entity 'fields))

此外,我完全不确定这是解决此问题的合理方法。我对宏还是很陌生,可能会犯一些错误。任何帮助/澄清将不胜感激。

笔记:

我意识到那个模型设计得很糟糕,下面的模型要好得多:
(def *model* {:users [:name :email :registered-on]
:post [:title :author]})

但是,在编写宏方面更复杂,因此我将保持原样。

最佳答案

我认为需要一个宏,因为 defentity似乎定义了一个类型。

(defmacro gen-entities
[model]
`(do
~@(for [[entity-kw values] model]
(let [entity-sym (-> entity-kw name capitalize symbol)
fields (map (comp symbol name) (keys (first values)))]
`(ds/defentity ~entity-sym [~@fields])))))

您不必相互摆弄键和值,只需通过交错将它们重新组合在一起即可。在 map 上映射将一次性为您提供键和相应的值。
user=> (macroexpand-1 `(gen-entities ~model))
(do
(ds/defentity Users [name registered-on email])
(ds/defentity Post [title authour]))

注意:这不适用于存储在 Var 中的模型。您必须在对 gen-entities 的调用中指定模型.
user=> (macroexpand-1 '(gen-entities model))
(
#<IllegalArgumentException java.lang.IllegalArgumentException: Don't know how to create ISeq from: clojure.lang.Symbol>

关于macros - 在 Clojure 中使用宏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5925048/

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