Clojure程序员如何使用宏?

Sal*_*lil 12 clojure

我的理解是Clojure的同质性存在,以便使编写宏更容易.

基于这个stackoverflow线程,除了不使用高阶函数的DSL之外,它看起来很少使用宏.

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

mik*_*era 17

这是正确的,同像性使得编写的Clojure宏很容易.基本上,它们使您能够编写构建所需代码的代码,利用Lisp的"代码是数据"理念.

同性语言中的宏也非常强大.我发现有一个有趣的示例演示文稿,他们在Clojure的三行中实现了类似LINQ的查询语法.

通常,Clojure宏可能有很多原因:

  • 控制结构 - 可以使用永远不能表示为函数的宏来创建某些控制结构.例如,你不能写成if一个函数,因为如果它是一个函数,那么它将必须评估所有三个参数,而使用宏你可以使它只评估两个(条件值和真或假表达式) )

  • 编译时优化 - 有时您希望基于已知或可在编译时计算的常量来优化代码.例如,您可以创建一个"日志记录"功能,仅在代码以调试模式编译时才记录,但在生产应用程序中创建零开销.

  • 代码生成/样板消除 - 如果您需要生成许多具有相似结构的非常相似的代码,那么您可以使用宏从几个参数自动生成这些代码.如果你讨厌样板,那么宏就是你的朋友.

  • 创建新语法 - 如果您认为需要特定的语法(可能封装了一个公共模式),那么您可以创建一个宏来实现它.例如,可以使用附加语法简化某些DSL.

  • 理论上讲,创建一种全新语义的新语言(学分为SK-Logic!)你甚至可以使用宏创建一种新语言,这将有效地将你的新语言编译成Clojure.新的langauge甚至不必像Lisp一样:它可以解析和编译任意字符串.

一个重要的建议是只在需要时使用宏,并且功能不起作用.大多数问题都可以通过功能来解决.除了宏对于简单情况而言过度杀戮之外,函数还有一些内在优势:它们更灵活,可以存储在数据结构中,可以作为参数传递给更高阶函数,更容易让人们理解等等.