RosettaCodeData/Task/A+B/Order/a+b.order

37 lines
1.6 KiB
Plaintext

#define ORDER_PP_DEF_1int_is_positive \
ORDER_PP_FN(8fn(8X, 8is_0(8tuple_at_0(8X))))
#define ORDER_PP_DEF_1int_get_unsigned \
ORDER_PP_FN(8fn(8X, 8tuple_at_1(8X)))
#define ORDER_PP_DEF_1int_add_impl \
ORDER_PP_FN(8fn(8A, 8B, 8S, 8int(8S, 8add(8A, 8B))))
#define ORDER_PP_DEF_1int_sub_impl \
ORDER_PP_FN(8fn(8A, 8B, \
8if(8greater(8A, 8B), \
8int(0, 8sub(8A, 8B)), \
8int(1, 8sub(8B, 8A)))))
#define ORDER_PP_DEF_8int_add \
ORDER_PP_FN(8fn(8A, 8B, \
8cond((8and(1int_is_positive(8A), 1int_is_positive(8B)), \
1int_add_impl(1int_get_unsigned(8A), 1int_get_unsigned(8B), 0)) \
(8and(1int_is_positive(8A), 8not(1int_is_positive(8B))), \
1int_sub_impl(1int_get_unsigned(8A), 1int_get_unsigned(8B))) \
(8and(8not(1int_is_positive(8A)), 1int_is_positive(8B)), \
1int_sub_impl(1int_get_unsigned(8B), 1int_get_unsigned(8A))) \
(8and(8not(1int_is_positive(8A)), 8not(1int_is_positive(8B))), \
1int_add_impl(1int_get_unsigned(8A), 1int_get_unsigned(8B), 1)))))
#define ORDER_PP_DEF_8int_to_lit \
ORDER_PP_FN(8fn(8X, \
8if(1int_is_positive(8X), \
8to_lit(1int_get_unsigned(8X)), \
8adjacent(8(-), 8to_lit(1int_get_unsigned(8X))))))
#define ORDER_PP_DEF_8int \
ORDER_PP_FN(8fn(8S, 8N, 8pair(8S, 8N)))
ORDER_PP(8int_to_lit(8int_add(A, B)))