Questions tagged «macros»

宏用于将一系列计算指令作为单个程序语句提供给程序员,从而减少了编程任务的繁琐程度和出错率。


2
C预处理程序的起源是什么?
C预处理程序已附加到C,但是它的语法与主要语言完全不同: 语法上显着的空格(行尾终止一条语句,宏确定替换列表的开始后的间隔) 基于关键字的块而不是支撑块,elif而不是else if 关键字主导的定义,而不是声明反射的使用,=对于值定义,否 其他字符串语法的提示(#include <>vs #include "") 惰性求值(显然是C的;但是6.10.3.1可以理解为也暗示着宏扩展的特定顺序,在一些重要的地方) 真的看起来根本不像C!从技术上讲,它是它自己的语言,但是它一直被用作C的几乎不可或缺的部分,并且它在语法上不与它集成似乎很奇怪。 维基百科没有谈论它的历史。波特兰模式存储库给了它一个提及,但没有详细介绍它是由其他人(而不是C的其他人)设计的。具有C历史的Dennis Ritchie的网站可能有答案,但不幸的是没有不再可用。 宏引擎,它显然已经从运行系统语言,这可以解释非常不同的语义一些差异,但不是视觉设计方面(这也不清楚现代眼光是否本来是打算作为能够在中样的的乐趣,其替代系统是否允许,或者它是否仅仅是在功能强大的优化程序之前的一种内联函数的便捷方式)。如果实际上像C一样的语义已经成为起点,那感觉似乎更接近最终成为C ++模板的东西向宏的逻辑发展。但是,没有比语法更具体的证据了。 我们是否有任何记录说明为何采用这种方式设计,或者创作者的影响是什么?
30 c  history  macros 

5
C ++模板只是一种美化的宏吗?
通过C ++模板和C#/ Java泛型之间的不同比较,例如: /programming/31693/what-are-the-differences-between-generics-in-c-and-java-and-templates-in-c/31929#31929 我感觉到,C ++模板是通过某种预处理(在解析之前替换纯文本)而不是通过编译实现的。因为C ++模板中的类型检查类似于C宏。我的意思是,如果存在一些错误,它们是处理模板代码块后生成的代码中的错误,而不是模板本身中的错误。换句话说,它们只是C语言中宏的一种上层版本。 然后我发现了其他一些事实支持这一点- 我认为,如果C ++模板通过预处理实现,则动态链接(使用.dll)会出现问题。快速搜索支持了这一点。 另一点是,整数常量可以作为参数传递给模板。而且它甚至支持某种递归。但是在编译的汇编/机器代码中找不到此递归。通过为每个递归调用生成函数,可以在编译时管理递归对象,因此具有更大但更快的可执行二进制文件。 尽管与C宏不同,但它具有一些优越的功能。但是C ++模板不是通过某种预处理实现的吗?如何在不同的C ++编译器中实现?
27 c++  c  compiler  templates  macros 

6
Lisp宏有多有用?
Common Lisp允许您编写执行所需源转换的宏。 Scheme为您提供了一个卫生的模式匹配系统,您还可以执行转换。宏在实践中有多有用?保罗·格雷厄姆(Paul Graham)在击败平均水平中说: Viaweb编辑器的源代码大概是20-25%的宏。 人们实际上最终会用宏做什么事情?
22 lisp  scheme  macros 

4
那么,LISP如何使宏系统的实现变得更容易呢?
我正在从SICP学习Scheme,给人的印象是,使Scheme以及LISP特别与众不同的很大一部分是宏系统。但是,由于宏是在编译时扩展的,所以人们为什么不为C / Python / Java /任何东西制作等效的宏系统?例如,可以将python命令绑定到expand-macros | python或任何其他内容。该代码对于不使用宏系统的人仍然可以移植,只是在发布代码之前扩展宏即可。但是除了C ++ / Haskell中的模板之外,我不知道其他类似的东西,我收集的模板并不完全相同。那么,LISP又如何使实现宏系统更容易呢?

1
为什么C库使用同名的宏和函数?
我正在阅读PJ Plauger的“标准C库”,这真的很有趣。该书不仅说明了如何使用该库,而且还说明了其实现方法。 我已经阅读完本ctype.h节,并且在标头中将函数声明为两个宏AND函数。例如 int isdigit(int); 但是也 #define isdigit(c) (_Ctype[(int)(c)] & _DI) 我不明白为什么两者都使用? 另外,如果我尝试重新创建自己的自定义ctype标头和实现,则只有删除宏(注释中的注释),我才能成功编译。 书中并没有真正解释这方面。有人可以解释一下吗?
20 c  naming  functions  macros 

19
具有类似Lisp的语法扩展机制的编程语言
按照目前的情况,这个问题不适合我们的问答形式。我们希望答案会得到事实,参考或专业知识的支持,但是这个问题可能会引起辩论,争论,民意调查或扩展讨论。如果您认为此问题可以解决并且可以重新提出,请访问帮助中心以获取指导。 7年前关闭。 我对Lisp的了解有限(尝试在业余时间学习一些知识),但据我了解,Lisp宏允许通过在Lisp本身中进行描述来引入新的语言结构和语法。这意味着可以将新构造作为库添加,而无需更改Lisp编译器/解释器。 这种方法与其他编程语言完全不同。例如,如果我想用一种新的循环或某种特定的习惯来扩展Pascal,则必须扩展该语言的语法和语义,然后在编译器中实现该新功能。 Lisp家族之外是否还有其他编程语言(即Common Lisp,Scheme,Clojure(?),Racket(?)等)提供了类似的在语言本身内扩展语言的可能性? 编辑 请避免进一步讨论,并在回答中要具体。我希望从概念的角度来理解一堆专门针对Lisp宏作为扩展机制的东西,以及哪些非Lisp编程语言可以提供某种概念,而不是一堆可以以某种方式进行扩展的编程语言的清单。靠近他们。

2
Lisp宏的典型应用是什么?
我正在尝试学习一些LISP,并且已经阅读了很多有关LISP宏的重要性的信息,因此我想获得一些有关它们的工作经验。 您能否建议一个实际的应用程序领域,使我可以使用宏来解决实际问题,并理解该编程结构的有用性? 注意 这不是通用的下一个问题我应该做什么项目。我有兴趣了解通常通过LISP宏解决哪些类型的问题。例如,它们对实现抽象数据类型有好处吗?为什么将这种构造添加到语言中?它解决了哪些无法通过简单功能解决的问题?

4
Python装饰器和Lisp宏
在查看Python装饰器时,有人声明,它们与Lisp宏(尤其是Clojure)一样强大。 看一下PEP 318中给出的示例,在我看来,它们只是在Lisp中使用普通的旧高阶函数的一种奇特方式: def attrs(**kwds): def decorate(f): for k in kwds: setattr(f, k, kwds[k]) return f return decorate @attrs(versionadded="2.2", author="Guido van Rossum") def mymethod(f): ... 在任何示例中都没有看到任何代码转换,如Clojure Macro的解剖中所述。另外,Python缺少同源性 可能使代码转换变得不可能。 那么,这两个如何比较,您能说他们在做事上大致相等吗?证据似乎与此相反。 编辑:根据评论,我正在寻找两件事:比较“功能强大”和“易于处理”。
18 python  lisp  clojure  macros 

3
使用C / C ++宏作为条件编译的快捷方式是一种好习惯吗?
假设我要在代码中包含几种类型的输出消息。其中之一是DEBUG,仅当在Debug模式下编译代码时才打印。 通常我必须写一些像 #ifdef DEBUG std::cout << "Debug message" << std::endl; #endif 在许多地方使用起来非常麻烦和烦人。 为代码段定义宏是一种好习惯,这样您就可以使用它吗? MSG_DEBUG("Debug message") 还是有没有其他更优雅的方式在没有宏的情况下如何处理它?我对C和C ++中可能的解决方案感兴趣,因为我在不同的项目中使用了这两种语言。
13 c++  c  macros 


3
字节码编织与Lisp宏
我一直在阅读人们为Java和C#等语言编写的库,这些库利用字节代码编织来完成诸如拦截函数调用,插入日志记录代码之类的事情。我还一直在阅读Lisp / Clojure宏试图更好地了解如何利用它们。我对宏的了解越多,它们似乎提供的功能与字节码编织库相同。功能是指在编译时处理代码的能力。 我一直在查看的库示例包括AspectJ,PostSharp和Cecil。 有什么可以做的而不是另一种?他们实际上解决了相同的问题,还是我在比较苹果和橙子?
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.