Clojure 中是否有一种方法可以编写返回两个或多个 s 表达式的宏(或使用现有的宏)?
示例。假设我正在尝试生成前 10 个方 block :
(map * (range 10) (range 10))
现在我想尝试使用repeat,以便稍后可以提供功率(目前为 2)作为参数:
(map * (repeat 2 (range 10)))
但是,上面的方法不起作用,因为 repeat 返回具有两个范围的单个 s 表达式,而不是两个范围。
请不要提供“返回前 10 个方 block ”函数的替代实现。我对处理此类情况的惯用方法或普遍适用的解决方法感兴趣。
我想我正在寻找一种方法来实现下面的explode:
(explode '( a b c )) ;; evals to a b c
(map * (explode (repeat 2 (range 10)))
最佳答案
单个宏无法做到这一点。
宏是一个函数,它采用一个 s 表达式并将其转换为另一个 s 表达式。输入可以是任何表达式序列(符号、原语、其他表达式等),输出可以是是插入代替原始宏调用的单个表达式。
一般来说,宏必须包围对映射和转换整个表单的调用
(your-macro-here (map * (repeat 2 (range 10))))
如果您有两个宏,一个生成表达式,另一个包含整个外部形式,则外部宏可能会找到包含宏结果的单个表达式(在您的示例中为两个范围),并将它们提升一级为tho 独立的表达。我不建议在实践中这样做,它只是为了说明宏的功能。
关于Clojure 宏返回两个或多个 s 表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15796831/