gpt4 book ai didi

macros - 如何编写 Clojure 宏来创建多个表达式?

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

是否可以在 Clojure 中编写一个生成多个值或表达式的宏?对我来说,这看起来是不可能的,至少不能使用语法引用模板 `(..)。

例如从:[1 4][1 (mr 2 3) 4][1 2 3 4]

或来自:

(do
(prn 1)
(prn 4))

通过:

(do
(prn 1)
(mr 2 3)
(prn 4))

至:

(do
(prn 1)
(prn 2)
(prn 3)
(prn 4))

最佳答案

宏将一种形式扩展为另一种形式,因此您不能让宏返回两个完全独立的形式。但是,您可以让它返回复合形式,例如执行许多操作的 do 语句。

(defmacro foo [n]
`(do ~@(map #(list println %) n)))

对于上面的示例,您可以将宏放在要修改的表单周围:

(expand-mr
(do
(prn 1)
(mr 2 3)
(prn 4)))

宏被设计为安全的,因此它们不能修改其自身范围之外的任何内容。目前,宏获取一个 s 表达式,并将其更改为另一个更有用或有帮助的 s 表达式。为了让宏返回两个单独的 s 表达式,它必须修改其封闭表达式。语法必须完全不同,我不清楚如何使用 s 表达式来完成此操作。解决方案是扩展宏的范围以包含它需要修改的所有内容。

关于macros - 如何编写 Clojure 宏来创建多个表达式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3763380/

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