45 lines
2.2 KiB
Plaintext
45 lines
2.2 KiB
Plaintext
#include <order/interpreter.h>
|
|
|
|
#define ORDER_PP_DEF_8hail ORDER_PP_FN( \
|
|
8fn(8N, 8cond((8equal(8N, 1), 1) \
|
|
(8is_0(8remainder(8N, 2)), 8quotient(8N, 2)) \
|
|
(8else, 8inc(8times(8N, 3))))) )
|
|
|
|
#define ORDER_PP_DEF_8h_loop ORDER_PP_FN( \
|
|
8fn(8S, \
|
|
8let((8F, 8fn(8E, 8env_ref(8(8H), 8E))), \
|
|
8do( \
|
|
8print(8seq_to_tuple(8seq_map(8F, 8S)) 8space), \
|
|
8let((8S, 8h_once(8S)), \
|
|
8if(8equal(1, \
|
|
8seq_fold(8times, 1, 8seq_map(8F, 8S))), \
|
|
8print_counts(8S), \
|
|
8h_loop(8S)))))) )
|
|
|
|
#define ORDER_PP_DEF_8h_once ORDER_PP_FN( \
|
|
8fn(8S, \
|
|
8seq_map( \
|
|
8fn(8E, \
|
|
8eval(8E, \
|
|
8quote( \
|
|
8env_bind(8(8C), \
|
|
8env_bind(8(8H), \
|
|
8env_bind(8(8E), 8E, 8E), \
|
|
8hail(8H)), \
|
|
8if(8equal(8H, 1), 8C, 8inc(8C))) ))), \
|
|
8S)) )
|
|
|
|
#define ORDER_PP_DEF_8print_counts ORDER_PP_FN( \
|
|
8fn(8S, \
|
|
8print(8space 8(Counts:) \
|
|
8seq_to_tuple(8seq_map(8fn(8E, 8env_ref(8(8C), 8E)), 8S)))) )
|
|
|
|
ORDER_PP(
|
|
8let((8S, // Build a list of environments
|
|
8seq_map(8fn(8N, 8seq_of_pairs_to_env(
|
|
8seq(8pair(8(8H), 8N), 8pair(8(8C), 0),
|
|
8pair(8(8E), 8env_nil)))),
|
|
8seq_iota(1, 13))),
|
|
8h_loop(8S))
|
|
)
|