您的位置:首页 > 编程语言

宏元编程——逻辑控制——实现循环一

2016-03-01 14:52 330 查看


循环宏定义

#define TL_WHILE(pred,op,state) while-body

pred是一个二元的宏形式是pred(d,state),当pred返回0的时候循环终止

op是一个二元的宏形式是op(d,state),它返回值是state_new

state代表初始状态

TL_WHILE宏的展开形式如下:
op(d, ... op(d, op(d, state)) ... )

实现思路

根据op(d, ... op(d, op(d, state)) ... )的形式,很容易想到用宏元编程提到的宏递归的方式实现。另外使用宏元编程——分支宏可以控制宏递归的停止条件。

#include "tl/cat.h"
#include "tl/control/if.h"

#define TL_WHILE(pred,op,state) TL_WHILE_I_1(pred,op,state)

#define TL_WHILE_I_1(pred,op,state) TL_IF(pred(1,state), TL_WHILE_I_2(pred, op, op(1,state)), state)
#define TL_WHILE_I_2(pred,op,state) TL_IF(pred(2,state), TL_WHILE_I_3(pred, op, op(2,state)), state)
#define TL_WHILE_I_3(pred,op,state) TL_IF(pred(3,state), TL_WHILE_I_4(pred, op, op(3,state)), state)
#define TL_WHILE_I_4(pred,op,state) TL_IF(pred(4,state), TL_WHILE_I_5(pred, op, op(4,state)), state)
#define TL_WHILE_I_5(pred,op,state) TL_IF(pred(5,state), TL_WHILE_I_6(pred, op, op(5,state)), state)
#define TL_WHILE_I_6(pred,op,state) TL_IF(pred(6,state), TL_WHILE_I_7(pred, op, op(6,state)), state)
#define TL_WHILE_I_7(pred,op,state) TL_IF(pred(7,state), TL_WHILE_I_8(pred, op, op(7,state)), state)
#define TL_WHILE_I_8(pred,op,state) TL_IF(pred(8,state), TL_WHILE_I_9(pred, op, op(8,state)), state)
#define TL_WHILE_I_9(pred,op,state) TL_IF(pred(9,state), TL_WHILE_I_10(pred, op, op(9,state)), state)
#define TL_WHILE_I_10(pred,op,state) TL_IF(pred(10,state), TL_WHILE_I_11(pred, op, op(10,state)), state)
#define TL_WHILE_I_11(pred,op,state) TL_IF(pred(11,state), TL_WHILE_I_END(pred, op, state), state)
#define TL_WHILE_I_END(pred,op,state) TL_WHILE_FAILED_EXCEED_11_LIMIT(pred, op, state)

#define PRED(n, state) TL_TUPLE_ELEM(1, state)
#define OP(n, state) (BOOST_PP_INC(TL_TUPLE_ELEM(0, state)), BOOST_PP_DEC(TL_TUPLE_ELEM(1, state)))

#define TUPLE1 (4,10)
#define TUPLE2 (4,11)
#define TUPLE3 (4,5)

TL_WHILE(PRED,OP,TUPLE1) => (14, 0)
TL_WHILE(PRED,OP,TUPLE2) => TL_WHILE_FAILED_EXCEED_11_LIMIT(PRED, OP, (14, 1))
TL_WHILE(PRED,OP,TUPLE3) => (9, 0)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: