![]() |
1
10
任何具有真正宏的语言都具有静态if形式。例如Lisp和 Nemerle 允许您使用“if”和for循环等编程结构构造宏扩展到的代码。这些基本上是编译时决策,并允许您执行类似于静态if的操作。对于Nemerle宏,基本上是编译时执行的编译器插件。 在C++中有 boost MPL 图书馆有一个 kind of static if 可用于在两种类型之间进行选择。您可以在run()成员的两个类型中放入一些代码,得到类似的东西,但语法非常繁琐。 例如,使用BoostMPL,您可以执行如下操作:
在D将是:
|
![]() |
2
2
对于“语言对代码的认识”,我所看到的最好的就是Lisp及其宏工具——特别是公共Lisp。但是这里的交易是,在大多数情况下,对象的类型在编译时或宏扩展时都是未知的。对于文本,类型是已知的,因此您可以找到攻击性宏的示例,这些宏测试对象是否是文本,如果是,则以一种方式处理对象(可能基于其类型),否则为运行时类型检查准备检测到的变量。 以下是我改编自 克利布 图书馆 CLOCC 图书馆)几年前。其目标是提供一些函数,这些函数将前缀字符串从具有匹配前缀的其他字符串中切掉。前缀可以在宏扩展时知道,也可以不知道。如果是,我们可以进行优化:首先计算前缀的长度,并将其作为文本嵌入,这样就不会在每次调用生成的函数时重新计算前缀的长度。宏一开始令人望而生畏,但实际生成的代码很小。
见表格
在中间?这是在宏扩展时检查第一个参数,根据参数是文本还是符号,它的类型可能已知,也可能未知。如果类型是符号,我们 假定 我们应该等到运行时再考虑它是指向其他值的变量。
这是表格的扩展部分
注意变量
现在看看窗体的扩展
现在没有计算“foo”的长度;它是内联的3。 在这个例子中,似乎工作太多了,但正如你的问题所说,能够做这样的事情是一种很好的能力。 |
![]() |
3
2
见提案 here . 有趣的是,其中一位作者是D. 也, it's possible to fake static-if in current C++ using compiler hacks . |
![]() |
Divyat · D语言的BNF语法形式[闭口] 7 年前 |
![]() |
hiropon · 有没有办法用Dlang同时分配多个变量? 7 年前 |
![]() |
Jonathan Wilbur · 从D中的抽象类运行单元测试? 7 年前 |
![]() |
thinwybk · 如何使用D访问linux字符设备? 7 年前 |
![]() |
user3069488 · 震波。D-未定义标识符(Dlang) 7 年前 |
![]() |
Dmitry Bubnenkov · 错误:实例化模板实例时出错 7 年前 |
![]() |
Matt Smith · 正在转义对局部变量的引用 9 年前 |
![]() |
StillLearningToCode · 将字符串解析为D中的标记 10 年前 |
![]() |
Suliman · D?的TUI(文本用户界面)? 10 年前 |