在Clojure中有没有办法编写一个返回两个或更多s表达式的宏(或使用现有的宏)?
例.假设我正在尝试生成前10个方块:
(map * (range 10) (range 10))
Run Code Online (Sandbox Code Playgroud)
现在我想尝试使用repeat,以便稍后我可以提供电源(现在为2)作为参数:
(map * (repeat 2 (range 10)))
Run Code Online (Sandbox Code Playgroud)
然而,上述情况不起作用,因为repeat返回具有两个范围的单个s表达式,而不是两个范围.
请不要提供"返回前10个方块"功能的替代实现.我对处理此类情况或一般适用的解决方法的惯用方法感兴趣.
我想我正在寻找一种方法来实现以下爆炸:
(explode '( a b c )) ;; evals to a b c
(map * (explode (repeat 2 (range 10)))
Run Code Online (Sandbox Code Playgroud)
单个宏无法做到这一点。
宏是一个函数,它接受一个 s 表达式并将其转换为另一个 s 表达式。输入可以是任何表达式序列(符号、原语、其他表达式等),输出是插入代替原始宏调用的单个表达式。
一般来说,宏必须包围对映射和转换整个表单的调用
(your-macro-here (map * (repeat 2 (range 10))))
Run Code Online (Sandbox Code Playgroud)
如果您有两个宏,一个生成表达式,另一个包含整个外部形式,则外部宏可能会找到包含宏结果的单个表达式(在您的示例中为两个范围),并将它们提升一级以成为独立的表达式。我不建议在实践中这样做,它只是为了说明宏的功能。