Clojure宏如何与C宏不同?
我是学习Clojure的新手。 我是在几个月前开始的。 我正在尝试学习宏。
我最初弄糊涂了解Clojure中的宏和高阶函数之间的区别,因为高阶函数可能需要lambda表达式并根据任何条件和过滤器执行其中一个要求多少次。
所以我发布了一个关于StackOverflow本身的简单示例。 我从答案中清除了疑惑。
这就是我所理解的,
所以我的问题是,它与C中使用的预处理器指令和宏有什么不同? Lisp / Clojure宏对于C宏完全缺乏并且经常被广泛使用的开发人员具有什么样的威力?
一些显着差异:
eval
) 可以说,宏仍然是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