[ create a new paste ] login | about

Link: http://codepad.org/4uXL7Pfm    [ raw code | output | fork ]

C, pasted on Jun 26:
#include<stdio.h>


#define PP_INC_0 1
#define PP_INC_1 2
#define PP_INC_2 3
#define PP_INC_3 4
#define PP_INC_4 5
#define PP_INC_5 6
#define PP_INC_6 7
#define PP_INC_7 8
#define PP_INC_8 8

#define PP_INC(n) PP_INC_I(n)
#define PP_INC_I(n) PP_INC_ ## n

#define PP_DEC_0 0
#define PP_DEC_1 0
#define PP_DEC_2 1
#define PP_DEC_3 2
#define PP_DEC_4 3
#define PP_DEC_5 4
#define PP_DEC_6 5
#define PP_DEC_7 6
#define PP_DEC_8 7

#define PP_DEC(n) PP_DEC_I(n)
#define PP_DEC_I(n) PP_DEC_ ## n

#define PP_IF_0(t, f) f
#define PP_IF_1(t, f) t

#define PP_IF(c, t, f) PP_IF_I(c, t, f)
#define PP_IF_I(c, t, f) PP_IF_ ## c (t, f)

#define PP_BOOL_0 0
#define PP_BOOL_1 1
#define PP_BOOL_2 1
#define PP_BOOL_3 1
#define PP_BOOL_4 1
#define PP_BOOL_5 1
#define PP_BOOL_6 1
#define PP_BOOL_7 1
#define PP_BOOL_8 1

#define PP_BOOL(n) PP_BOOL_I(n)
#define PP_BOOL_I(n) PP_BOOL_ ## n

#define PP_TUPLE_ELEM_1_0(a) a
#define PP_TUPLE_ELEM_2_0(a, b) a
#define PP_TUPLE_ELEM_2_1(a, b) b
#define PP_TUPLE_ELEM_3_0(a, b, c) a
#define PP_TUPLE_ELEM_3_1(a, b, c) b
#define PP_TUPLE_ELEM_3_2(a, b, c) c

#define PP_TUPLE_ELEM(n, i, tup) PP_TUPLE_ELEM_I(n, i, tup)
#define PP_TUPLE_ELEM_I(n, i, tup) PP_TUPLE_ELEM_II(PP_TUPLE_ELEM_ ## n ## _ ## i tup)
#define PP_TUPLE_ELEM_II(a) a

#define PP_EXP_REC_0(f, v) f(v)
#define PP_EXP_REC_1(f, v) PP_EXP_REC_0(f, PP_EXP_REC_0(f, v))
#define PP_EXP_REC_2(f, v) PP_EXP_REC_1(f, PP_EXP_REC_1(f, v))
#define PP_EXP_REC_3(f, v) PP_EXP_REC_2(f, PP_EXP_REC_2(f, v))
#define PP_EXP_REC_4(f, v) PP_EXP_REC_3(f, PP_EXP_REC_3(f, v))
#define PP_EXP_REC_5(f, v) PP_EXP_REC_4(f, PP_EXP_REC_4(f, v))
#define PP_EXP_REC_6(f, v) PP_EXP_REC_5(f, PP_EXP_REC_5(f, v))
#define PP_EXP_REC_7(f, v) PP_EXP_REC_6(f, PP_EXP_REC_6(f, v))
#define PP_EXP_REC_8(f, v) PP_EXP_REC_7(f, PP_EXP_REC_7(f, v))
#define PP_EXP_REC_9(f, v) PP_EXP_REC_8(f, PP_EXP_REC_8(f, v))
#define PP_EXP_REC_10(f, v) PP_EXP_REC_9(f, PP_EXP_REC_9(f, v))

#define PP_EXP_REC(exp, f, v) PP_EXP_REC_I(exp, f, v)
#define PP_EXP_REC_I(exp, f, v) PP_EXP_REC_ ## exp (f, v)

#define PP_WHILE(p, f, v) PP_TUPLE_ELEM(3, 2, PP_EXP_REC(10, PP_WHILE_I, (p, f, v)))
#define PP_WHILE_I(pfv) PP_WHILE_II pfv
#define PP_WHILE_II(p, f, v) (p, f, PP_IF(p(v), f(v), v))

#define PP_ADD(m, n) PP_TUPLE_ELEM(2, 1, PP_WHILE(PP_ADD_P, PP_ADD_L, (m, n)))
#define PP_ADD_P(mn) PP_BOOL(PP_TUPLE_ELEM(2, 0, mn))
#define PP_ADD_L(mn) PP_ADD_L_I mn
#define PP_ADD_L_I(m, n) (PP_DEC(m), PP_INC(n))

#define PP_TO_STR(a) PP_TO_STR_I(a)
#define PP_TO_STR_I(a) PP_TO_STR_II(a)
#define PP_TO_STR_II(a) #a

main() {
  printf("%s", PP_TO_STR(PP_ADD(PP_ADD(3, 1), 2)));
  return 0;
}


Output:
1
6


Create a new paste based on this one


Comments: