我希望能够使用更成熟的语言编写预处理器宏。理想情况下,这样的语言将包括以下功能:
- 布尔和自然算术和比较
- 基于比较的分支
- 列表表示
- 递归
- 变量绑定
- 作为一等值和高阶函数的函数
- 部分函数应用和柯里化
- 功能原语,例如
map
和fold
- 常见代码生成任务的有用函数/结构
这可以在 C 预处理器中实现吗?
我希望能够使用更成熟的语言编写预处理器宏。理想情况下,这样的语言将包括以下功能:
map
和fold
这可以在 C 预处理器中实现吗?
令人难以置信的是,答案是肯定的!Order仅头文件库提供了一组在 C 预处理器中实现函数式语言的宏。它包括所有指定的功能等等。只要您的 C 预处理器几乎完全符合 C99,您就可以使用它。GNU CPP(在 GCC 和 G++ 中使用)是兼容的,Boost Wave 预处理器也是如此。Order 自 2004 年以来一直存在。虽然它不再维护,但它的功能非常齐全,如果没有完整记录的话。
下面是一个使用 Order 的简单示例:
#define AVERAGE(...) ((ORDER_PP( \
8seq_for_each_with_delimiter( \
8put, \
8emit(8quote(+)), \
8tuple_to_seq(8quote((__VA_ARGS__)))))) / \
ORDER_PP(8to_lit(8tuple_size(8quote((__VA_ARGS__))))))
宏AVERAGE
扩展为一个表达式,表示所提供参数的平均值。AVERAGE(a, b, c)
(例如)扩展为((a + b + c) / 3)
. 这是一个非常简单的示例,它没有使用 Order 的所有功能。
另一个简单的例子,展示了预编译算术的使用(使用任意精度的自然数表示),作为第一类值的函数(参见使用8plus
)和变量绑定,是一个用于在预处理器中计算(整数算术)平均值的宏:
#define AVERAGE_LITERAL(...) ORDER_PP(\
8let((8A, 8quote((__VA_ARGS__))), \
8to_lit(8quotient( \
8seq_fold(8plus, 0, 8tuple_to_seq(8A)), \
8tuple_size(8A)))))
AVERAGE_LITERAL(5, 6, 8, 9)
扩展到7
.
我只谈到了其中的一些功能。随附的文档和教程中提供了更多实用示例,包括展示 Order 如何帮助消除几乎所有繁琐的代码重复的示例。
Order 非常强大,对 C++ 程序员来说还是很重要的——模板和内联只能解决一些问题。订单解决了大多数其他问题。我能找到的唯一固有限制是无法以替换或连接以外的任何方式操作字符串文字或操作标记,因为这是由 C 预处理器强加的。