+ EnvironmentPool* environmentPool = EnvironmentPool_construct();
+ Environment* environment = EnvironmentPool_allocate(environmentPool);
+ Environment_initialize(environment, NULL);
+
+ Stack stackMemory;
+ Stack* stack = &stackMemory;
+ Stack_initialize(stack);
+
+ jmp_buf jump;
+ if(setjmp(jump) != 0)
+ {
+ fprintf(stderr, "\tin __main__\n");
+
+ while(Stack_any(stack))
+ {
+ Object item = Stack_pop(stack);
+ Object_deinitialize(&item);
+ }
+ Environment_setLive(environment, false);
+ EnvironmentPool_destruct(environmentPool);
+
+ // TODO We would like to return something nonzero here, but that messes up Valgrind so we couldn't catch memory leaks
+ return 0;
+ }
+
+ // TODO Use the symbol from SYMBOL_LIST
+ {% for builtin in builtins %}
+ Environment_set(environment, "{{ builtin }}", builtin${{ builtin }});
+ {% endfor %}
+
+ Environment_set(environment, "true", builtin$true);
+ Environment_set(environment, "false", builtin$false);
+ Environment_set(environment, "__add__", builtin$add);
+ Environment_set(environment, "__subtract__", builtin$subtract);
+ Environment_set(environment, "__multiply__", builtin$multiply);
+ Environment_set(environment, "__integer_divide__", builtin$integer_divide);
+ Environment_set(environment, "__modular_divide__", builtin$modular_divide);
+ Environment_set(environment, "__negate__", builtin$negate);
+ Environment_set(environment, "__concat__", builtin$concat);
+ Environment_set(environment, "__field__", builtin$field);
+ Environment_set(environment, "__get__", builtin$get);
+
+ {% for op in ['lt', 'gt', 'lte', 'gte', 'eq', 'neq'] %}
+ Environment_set(environment, "__{{ op }}__", builtin${{ op }});
+ {% endfor %}