Macros 宏:什么&x27;好处是什么?

Macros 宏:什么&x27;好处是什么?,macros,language-design,Macros,Language Design,保罗·格雷厄姆: 例如,类型似乎是一个 取之不尽的研究资源 文件,尽管事实是静态的 键入似乎排除了真正的宏-- 在我看来,没有这一点,就不可能 语言是值得使用的 宏有什么大不了的?我没有花太多时间研究它们,但从我使用过的遗留C/C++来看,在模板/泛型出现之前,它们似乎主要被用作黑客 很难想象 DECLARELIST(StrList, string); StrList slist; 在某种程度上比 List<String> slist; 为什么不把它定义为一个函数呢?这是一种优化

保罗·格雷厄姆:

例如,类型似乎是一个 取之不尽的研究资源 文件,尽管事实是静态的 键入似乎排除了真正的宏-- 在我看来,没有这一点,就不可能 语言是值得使用的

宏有什么大不了的?我没有花太多时间研究它们,但从我使用过的遗留C/C++来看,在模板/泛型出现之前,它们似乎主要被用作黑客

很难想象

DECLARELIST(StrList, string);
StrList slist;
在某种程度上比

List<String> slist;
为什么不把它定义为一个函数呢?这是一种优化吗?在这种优化中,您可以避免代码重复,而不会增加另一个堆栈帧的开销

此外,还有一些棘手的控制流问题,涉及到GOTO,这些问题似乎价值不大


宏有什么了不起的?它们的类型安全性较差(在C和C++中)(对吧?)。为什么Paul Graham程序不能没有它们呢?

宏在C/C++中只适用于两件事,通常应该是最后的工具(如果不使用宏就可以完成某些事情,那么就这样做)

  • 创建语言中不存在的新语法结构或抽象
  • 消除重复,尤其是必须相互同步的事物之间的重复
  • 几乎从未将宏用作函数


    您还必须认识到LISP宏不是C/C++宏。

    宏在C/C++中只适用于两件事,通常应该是最后的工具(如果不使用宏就可以完成某些事情,那么就这样做)

  • 创建语言中不存在的新语法结构或抽象
  • 消除重复,尤其是必须相互同步的事物之间的重复
  • 几乎从未将宏用作函数


    您还必须认识到LISP宏不是C/C++宏。

    LISP宏是一种完全不同的野兽。C/C++宏只能使用一种极其基本的语言用另一段文本替换一段文本。而LISP程序(在“读取”之后)是LISP数据结构,因此可以使用整个语言进行操作

    有了这样的宏,你可以(考虑到你是一个非常聪明的黑客)极大地扩展语言,每个人都可以相对容易地使用它,因为你是用宏实现的。以公共Lisp对象系统为例。在它的核心,语言没有任何类似对象的东西。它完全在语言本身中实现,包括一个相对简单的语法供使用-使用宏


    当然,当语言中内置了大多数您想要的东西时,宏就不那么必要了。OTOH,LISP的粉丝们认为,一种足够简单的语言(LISP)和足够强大的元编程功能(宏)更好,因为新概念可以在不改变规范或工作实现的情况下融入到语言中。但最引人注目的宏使用示例是DSL领域。RubyonRails和其他软件每天都在展示DSL是多么有用。是的,Ruby没有宏,它只是利用Ruby语法可以弯曲的程度。在其他语言中,或者当Ruby的语法不够灵活时,您需要宏或完全成熟的解析器/解释器来实现复杂的DSL。

    LISP宏是一种完全不同的野兽。C/C++宏只能使用一种极其基本的语言用另一段文本替换一段文本。而LISP程序(在“读取”之后)是LISP数据结构,因此可以使用整个语言进行操作

    有了这样的宏,你可以(考虑到你是一个非常聪明的黑客)极大地扩展语言,每个人都可以相对容易地使用它,因为你是用宏实现的。以公共Lisp对象系统为例。在它的核心,语言没有任何类似对象的东西。它完全在语言本身中实现,包括一个相对简单的语法供使用-使用宏


    当然,当语言中内置了大多数您想要的东西时,宏就不那么必要了。OTOH,LISP的粉丝们认为,一种足够简单的语言(LISP)和足够强大的元编程功能(宏)更好,因为新概念可以在不改变规范或工作实现的情况下融入到语言中。但最引人注目的宏使用示例是DSL领域。RubyonRails和其他软件每天都在展示DSL是多么有用。是的,Ruby没有宏,它只是利用Ruby语法可以弯曲的程度。在其他语言中,或者当露比的语法不够灵活时,你需要宏或完全解析器/解释器来实现复杂的DSL。

    我相信保罗·格雷厄姆所谈论的宏不是真正的和C和C++中一样的宏,而是更像Lisp宏。我不能用任何权威来讨论这个问题,所以不是评论而是回答。我相信保罗·格雷厄姆所谈论的宏不是真正的和C和C++中一样的宏,而是更像Lisp宏。不过,我不能就此事与任何权威人士交谈,因此发表了评论而不是回答。是的,我想可以安全地假设Paul Graham谈论的是Lisp宏。关键的区别是什么?是的,我想可以假设Paul Graham谈论的是Lisp宏。关键区别是什么?
    POINTS MAKEPOINTS(
        DWORD dwValue
    );