32 typedef typename compositor_t::function function_t;
35 std::vector<T> square(
static_cast<std::size_t
>(n * n), T(0));
39 symbol_table_t symbol_table;
40 symbol_table.add_constant(
"n", n);
41 symbol_table.add_vector (
"square", square);
42 symbol_table.add_function(
"print_digit",
44 { printf(
" %03d ",
static_cast<int>(v));
return 0; });
45 symbol_table.add_package (io_package);
47 compositor_t compositor(symbol_table);
49 compositor.load_variables(
true);
50 compositor.load_vectors (
true);
53 function_t(
"get_square")
56 (
" square[row * n + col]; " ));
59 function_t(
"set_square")
60 .vars(
"col",
"row",
"value")
62 (
" square[row * n + col] := value; " ));
65 function_t(
"display_magic_square")
68 " for (var row := 0; row < n; row += 1) "
70 " for (var col := 0; col < n; col += 1) "
72 " print_digit(get_square(col,row)); "
79 const std::string magic_square_program =
82 " var j := floor(n / 2); "
84 " while (num <= (n * n)) "
86 " set_square(i, j, num); "
89 " var i_next := (i - 1 + n) % n; "
90 " var j_next := (j + 1) % n; "
92 " if (get_square(i_next, j_next) != 0) "
103 " println('sum: ', n * (n^2 + 1) / 2); "
105 " display_magic_square(); ";
107 expression_t expression;
108 expression.register_symbol_table(symbol_table);
111 parser.compile(magic_square_program,expression);