TL_ADD和TL_SUB可以由基本数据结构TL_TUPLE,流程控制TL_WHILE和算数计算TL_INC,TL_DEC组合实现。
TL_ADD实现如下:
#define TL_ADD(p1,p2) TL_TUPLE_ELEM(0, \
<span style="white-space:pre"> </span>TL_WHILE(TL_ADD_P,TL_ADD_OP,(p1,p2)) \
<span style="white-space:pre"> </span>) \
#define TL_ADD_P(r, state) TL_TUPLE_ELEM(1,state)
#define TL_ADD_OP(r, state) \
<span style="white-space:pre"> </span>( \
<span style="white-space:pre"> </span>TL_INC(TL_TUPLE_ELEM(0,state)), \
<span style="white-space:pre"> </span>TL_DEC(TL_TUPLE_ELEM(1,state)) \
<span style="white-space:pre"> </span>) \
TL_SUB实现如下:
#define TL_SUB(p1,p2) TL_TUPLE_ELEM(0, \
TL_WHILE(TL_SUB_P,TL_SUB_OP,(p1,p2)) \
) \
#define TL_SUB_P(r, state) TL_TUPLE_ELEM(1,state)
#define TL_SUB_OP(r, state) \
( \
TL_DEC(TL_TUPLE_ELEM(0,state)), \
TL_DEC(TL_TUPLE_ELEM(1,state)) \
) \
TL_MUL实现如下:
#define TL_MUL(p1,p2) TL_TUPLE_ELEM( \
2, \
TL_WHILE(TL_MUL_P,TL_MUL_OP,(p1,p2,0)))
#define TL_MUL_P(r, state) TL_TUPLE_ELEM(1,state)
#define TL_MUL_OP(r, state) \
( \
TL_TUPLE_ELEM(0,state), \
TL_DEC(TL_TUPLE_ELEM(1,state)), \
<span style="color:#ff0000;">TL_ADD_D</span>( \
TL_TUPLE_ELEM(2,state), \
TL_TUPLE_ELEM(0,state)), \
)
注意上面红色标注的宏TL_ADD_D,这个地方没有用TL_ADD。主要原因是宏不能重入。TL_ADD里面在实现的时候会用到TL_WHILE。TL_MUL本身也会用到TL_WHILE,这会导致内层的TL_WHILE不会展开。具体如何用比较优雅的方法处理重入见
宏元编程——谈谈宏的重入机制——TL_WHILE优化