gpt4 book ai didi

clojure - 我可以在 Clojure 的宏中引用宏吗?

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

Clojure。草书。重复。 Windows 10。全部是最新的。

这是我的“基本”宏:

(defmacro PutProp! [Sym Val PName]
`(reset-meta! (var ~Sym) (assoc (meta (var ~Sym)) ~PName ~Val)))

我不知道这在做我想做的事情时是否正确,即使用新的修改Sym的元数据键名PName Val 值。我是新手,我确信我已经跳进了泳池的最深处。我使用宏是因为我认为它可以避免我在 Clojure 中不理解的困惑变量绑定(bind)问题。

然后我编写了另一个宏来在一次调用中定义大量元数据:

(defmacro DefMeta! [L]  ;; Given a symbol (first L), define metadata for it given in (next L).
`(let [S (first ~@L)] ;; The symbol we're modifying is the first element in list L.
(map (fn [[K V]] (PutProp! S V K)) (next ~@L)))) ;; (next L) is the list of key/value pairs.

我也不确定这就是我想写的。在 REPL 工作时,我定义了一个符号:

(def Sym 0)

然后我执行 DefMeta 的 Macroexpand-1!:

(macroexpand-1 '(DefMeta! [Sym :VName :VValue]))

我得到以下信息:

(clojure.core/let
[thic.core/S (clojure.core/first Sym :VName :VValue)]
(clojure.core/map
(clojure.core/fn [[thic.core/K thic.core/V]] (thic.core/PutProp! thic.core/S thic.core/V thic.core/K))
(clojure.core/next Sym :VName :VValue)))

它不会宏扩展 PutProp!宏。

我很困惑。我有本关于 Clojure 编程的书,其中没有提到宏调用中的宏调用。甚至合法吗?如果是这样,我如何完全展开内部宏,以便我可以看到我写的内容是否是我想要的? [...长期存在的程序员问题...]

PS 我尝试了macroexpand-all,我对一切的宏扩展感到不知所措,甚至是 Clojure 核心函数。
请比这个少一些。请问?

最佳答案

which doesn't macro-expand the PutProp! macro.

是的,macroexpand-1 仅执行一次宏扩展。宏展开的整个过程是一个定点计算,每棵树都会展开,直到达到无法再展开的形式。

您可能想使用macroexpand-all

此外,宏中的输入列表是一个表达式列表,您希望在宏扩展时获取该列表的第一个和下一个。

(first ~@L)

上面的内容扩展为:

(clojure.core/first Sym :VName :VValue)

您实际上只需要 Sym,即:

~(first L)

关于clojure - 我可以在 Clojure 的宏中引用宏吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65829408/

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