Clojure 宏返回两个或多个 s 表达式

标签 clojure

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/

相关文章:

javascript - 将任意 JavaScript 代码存储到字符串变量中

clojure - Clojure 中的工作队列

clojure - 在 Compojure 中默认提供 index.html

java - 现实世界中的 Clojure 和 Java 互操作

clojure - 如何在 Clojure 中编写这段代码

clojure - 如何将Java字符串转换为EDN对象?

java - 是否有与 Clojure 的 if-let 等效的 Java?

java - 禁用 SSL 连接的主机名检查?

performance - 为什么这个 Clojure 微基准测试这么慢?

clojure - 这段代码如何将数字翻译成英文?