![]() |
1
62
函数和宏的区别在于,在函数调用时,首先计算函数的参数,然后使用参数计算函数体。 另一方面,宏描述了从一段代码到另一段代码的转换。任何评估都发生在转换之后。
一个小例子来说明不同之处:
宏
在这里
|
![]() |
2
38
|
![]() |
3
12
宏就像一个学徒程序员,你可以给他写笔记: 有时候,如果我试着调试一些东西,我喜欢改变一些东西,比如
变成这样:
刚刚评估过,它的值,以及返回的值作为结果 这可能非常有用,但它很耗时,而且容易出错。你可以想象 你可以编写编译器来为你做这些事情,而不是雇佣学徒。
现在试试:
作为一台计算机,它为变量选择不可读的名称,而不是我会选择的“a”。 我们可以问它对一个给定的表达式有什么作用:
这就是它的答案,所以你可以看到它真的在为你重写代码:
试着写一个函数dbgf做同样的事情,你会有问题,因为(dbgf(*3 2))->(dbgf 6)在dbgf被调用之前,所以不管dbgf做什么,它都不能恢复它需要打印出来的表达式。 尝试在有副作用和值的表达式上使用它,如
事实上,宏是如此之好,以至于我们已经准备好使用LISPs的(brackety((syntax)),以便获得它们。(虽然我必须说我喜欢它是因为它本身(但是我有点奇怪)。 C也有宏,它们的工作方式大致相同,但它们总是出错,为了使它们正确运行,您需要在程序中放入许多括号,使其看起来像LISP! 实际上,我们建议您不要使用C的宏,因为它们非常容易出错,尽管我看到真正了解它们的人使用它们时效果非常好。
基础语言非常简单,因此易于实现,然后使用宏构建复杂的上层结构。 我真希望这有帮助。这比我通常的回答要长,因为你问了一个很深的问题。祝你好运。 |
![]() |
4
3
一个人不发出刺耳的声音,就创造了一个 ,而另一个创建 宏
实际上会扩展到
其中
在实际处理传递给他们的数据之前。 这里有一个非常可爱的故事,可以帮助解释不同之处(后面是一些有用的例子) Practical Common Lisp: Chapter 8 |
![]() |
5
0
defn定义函数,defmacro定义宏。
|
![]() |
Freid001 · 具有最小和最大限制的架构? 6 年前 |
![]() |
phlie · Hoplon With Castra加载后端时出错 6 年前 |
![]() |
David Furnam · Clojure从数组中获取坐标 6 年前 |
![]() |
Jeroen · 如何将惰性序列转换为映射? 6 年前 |