Clojure宏如何与C宏不同?

我是学习Clojure的新手。 我是在几个月前开始的。 我正在尝试学习宏。

我最初弄糊涂了解Clojure中的宏和高阶函数之间的区别,因为高阶函数可能需要lambda表达式并根据任何条件和过滤器执行其中一个要求多少次。

所以我发布了一个关于StackOverflow本身的简单示例。 我从答案中清除了疑惑。

这就是我所理解的,

  • 宏不会评估所有参数,而不像函数来评估主体。
  • 宏可以选择性地评估什么以及什么不是以及如何使用引号,不引用和拼接语法将一段代码转换为另一段代码。
  • 然后评估来自宏的最终代码。
  • 所以我的问题是,它与C中使用的预处理器指令和宏有什么不同? Lisp / Clojure宏对于C宏完全缺乏并且经常被广泛使用的开发人员具有什么样的威力?


    一些显着差异:

  • Clojure宏对Lisp数据结构进行操作,而C宏则对文本进行操作。 这种能力是Lisp同质化的结果(即Lisp源代码表示为Lisp数据结构)。 宏观系统的有效性并不是严格必要的,但它确实使它更加方便和自然。
  • 您可以在运行时执行Clojure宏以及编译时间(例如使用eval
  • Clojure宏是用Clojure本身编写的 。 与C预处理宏对比,它们有自己独立的迷你语言。 编写更复杂的宏时,这是一个很大的优势:您不必在不同语言之间进行思维切换(当然,您仍然需要从心理上区分要在处理宏时要执行的代码与要执行的代码生成为宏的输出)
  • Clojure宏是图灵完成的 - 你可以在其中执行任意代码生成。 标准C预处理器宏不适用,它们在表示复杂代码生成的能力方面有所限制。 编辑 :谢谢Jeremy提供的链接,一些有趣的黑客可以通过C预处理器强制转换完成。 总体观点仍然存在:这些并不是真正实用的编写通用代码的方法。
  • 可以说,宏仍然是Lisps的显着“杀手级特征”。 有关此主题的一点额外解释,值得阅读Paul Graham的文章“What Made Lisp Different”


    C宏允许纯文本替换,并且非常笨(就可以执行的操作而言)。 此外,如果它确实允许更复杂的表达式,那么使用它将会很麻烦,因为您操作的是纯字符串。

    由于Clojure和Lisp通常使用S表达式(它们只是简单的链表),并且允许在宏扩展时使用完整的语言,所以可以构建更加复杂和有用的表达式。


    C宏是纯粹的文本重写宏。 除了它们来自哪里外,没有什么可怕的C关于它们 - 你可以在任何文本上使用C预处理器cpp(1)。 因此,使用C预处理器很容易生成非C形式,而且您经常不得不跳过循环来做C相当简单的事情。 C宏因此而充满了陷阱。

    Clojure宏是Clojure代码,它使用与常规Clojure函数不同的一组规则执行。 他们不接收评估参数并返回结果,而是接收未评估的表单并返回一个表单,最终可能会在正常执行过程中对其进行评估。

    链接地址: http://www.djcxy.com/p/33629.html

    上一篇: How are Clojure macros different from C macros?

    下一篇: Is this idiomatic Clojure?