clojure - Clojure 程序员如何使用宏?

标签 clojure

我的理解是Clojure's homoiconicity存在是为了使编写宏更容易。

基于this stackoverflow thread ,看起来宏很少使用,除了不使用高阶函数的 DSL。

有人可以分享一些在现实生活中如何使用宏的示例吗?

最佳答案

正确的是homoiconicity使得编写 Clojure 宏变得非常容易。基本上,它们使您能够编写代码来构建您想要的任何代码,利用 Lisp 的“代码就是数据”哲学。

同形语言中的宏也非常强大。我发现了一个有趣的示例演示文稿 implement a LINQ-like query syntax in just three lines of Clojure .

一般来说,Clojure 宏可能有用的原因有很多:

  • 控制结构 - 可以使用宏来创建某些永远不能表示为函数的控制结构。例如,您不能将 if 编写为函数,因为如果它是一个函数,那么它必须计算所有三个参数,而使用宏,您可以让它只计算两个(条件值以及 true 或 false 表达式)

  • 编译时优化 - 有时您希望根据已知或可以在编译时计算的常量来优化代码。例如,您可以创建一个“日志记录”函数,仅在代码在 Debug模式下编译时才记录日志,但在生产应用程序中创建零开销。

  • 代码生成/样板消除 - 如果您需要生成大量具有相似结构的非常相似的代码,那么您可以使用宏从几个参数自动生成这些代码。如果您讨厌样板文件,那么宏就是您的 friend 。

  • 创建新语法 - 如果您发现需要有用的特定语法(可能封装通用模式),那么您可以创建一个宏来实现它。例如,某些 DSL 可以通过附加语法进行简化。

  • 创建具有全新语义的新语言(归功于 SK-Logic!)理论上,您甚至可以使用宏创建新语言,这将有效地编译您的新语言语言深入到 Clojure 中。新语言甚至不必像 Lisp 那样:例如,它可以解析和编译任意字符串。

一条重要的建议是仅在需要时才使用宏,并且函数将无法工作。大多数问题都可以用函数来解决。除了宏对于简单情况来说太过分这一事实之外,函数还有一些固有的优势:它们更灵活,可以存储在数据结构中,可以作为参数传递给高阶函数,更容易让人理解等等。

关于clojure - Clojure 程序员如何使用宏?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7593931/

相关文章:

Clojure 将 var 嵌入到 String,还有另一种方法吗?喜欢 sprintf 方式吗?

open-source - 有哪些非常大的函数式语言项目可以免费获得?

macros - 在宏上取消引用 [& args]

clojure - 访问 Compojure 查询字符串

Clojure 惯用的 get-and-set 函数

clojure - Clojure引用和添加 watch

java - Clojure Intellij Cursive插件JDK错误

java - Clojure:动态导入java类

clojure - 在clojure中,如何获取当前命名空间的文件名?

clojure - 我如何在 Clojure 中拆分原子?