int main(void) { (void)box_float; (void)box_double; (void)box_string; /*Allocate an environment * The environment size depends on how many nested functions there are ? */ svalue_t **env = calloc(sizeof (svalue_t *), 2); /* Get the final closure */ svalue_t *closure1 = make_closure(make_doubleadder, env); /* Invoke the closure that the closure returns */ svalue_t *c1 = invoke1(closure1, box_int(23)); svalue_t *c2 = invoke1(c1, box_int(5)); svalue_t *result = invoke1(c2, box_int(334)); /* The final result */ printf("print 23 + 5 + 334 == %d\n", result->value.integer); svalue_t *a = box_int(123); svalue_t *b = box_int(455); svalue_t *improper = box_pair(a, b); improper->value.pair.right = improper; /* woo cyclic pair */ printf("(%d, %d)\n", improper->value.pair.left->value.integer, improper->value.pair.right->value.pair.left->value.integer); return 0; }
int compile_blit_string(int retreg, Cell* args, int requires) { compile_arg(JIT_R0, car(args), TAG_BYTES); // font stack_push(JIT_R0, &stack_ptr); args = cdr(args); compile_arg(JIT_R0, car(args), TAG_ANY); // string stack_push(JIT_R0, &stack_ptr); compile_int_arg(); compile_int_arg(); compile_int_arg(); compile_int_arg(); compile_int_arg(); compile_int_arg(); jit_prepare(); push_stack_arg(); // color push_stack_arg(); // h push_stack_arg(); // w push_stack_arg(); // y push_stack_arg(); // x push_stack_arg(); // cursor_pos (or -1) push_stack_arg(); // string push_stack_arg(); // font jit_finishi(blit_string1); jit_retval(retreg); box_int(retreg, requires); return 1; }
static inline svalue_t* make_doubleadder_inner_inner(svalue_t **z, svalue_t **env) { int x,y; x = env[0]->value.integer; y = env[1]->value.integer; z[0]->value.integer = x + y + (z[0]->value.integer); return box_int(z[0]->value.integer); }
svalue_t* read_scm(source_t source_code) { size_t nbytes = read(STDIN_FILENO, source_code, 111000); if (nbytes == 0) { exit(EXIT_FAILURE); } token_stream toks = tokenize(source_code, 0, nbytes); token_t current_tok; while (toks.length > 0) { current_tok = peek_token(&toks); switch (current_tok.token_type) { case SYMBOL: printf("symbol: %s\n", current_tok.token.symbol); break; case IDENTIFIER: printf("identifer: %s\n", current_tok.token.identifier); break; case INTEGER: printf("integer: %s\n", current_tok.token.integer); break; case FLOATING: printf("floating: %s\n", current_tok.token.floating); break; case QUOTE: printf("quote: '\n"); break; case WSPACE: printf("whitespace\n"); break; case PAREN: printf("paren: %s\n", current_tok.token.parenthesis); break; case EMPTY: printf("this should not be empty\n"); break; case STRING: printf("string: %s\n", current_tok.token.string); break; default: printf("oops, there was an unknown token, check valgrind or gdb\n"); } pop_token(&toks); } return box_int(12); }