int main(int argc, char *argv[]) { printf("Welcome to Shoestrap\n"); struct sl_interpreter_state *state = sl_init(); char *input_string = malloc(MAX_INPUT_SIZE * sizeof(char)); sl_value in, out; while (1) { printf(">> "); fflush(stdin); input_string = fgets(input_string, MAX_INPUT_SIZE, stdin); if (input_string == NULL) { break; } struct sl_keep_list *old = state->keep_list; in = sl_read(state, input_string); out = sl_eval(state, in, state->global_env); sl_free_keep_list(state->keep_list, old); state->keep_list = old; sl_p(state, out); } free(input_string); sl_destroy(state); return 0; }
static sl_value eval_each(struct sl_interpreter_state *state, sl_value args, sl_value environment) { assert(sl_type(args) == state->tList); if (args == state->sl_empty_list) { return state->sl_empty_list; } else { sl_value first = sl_first(state, args); sl_value rest = sl_rest(state, args); return sl_list_new(state, sl_eval(state, first, environment), eval_each(state, rest, environment)); } }
void anthy_sort_metaword(struct segment_list *seg_list) { int i; /**/ sl_eval(seg_list); /**/ for (i = 0; i < seg_list->nr_segments; i++) { struct seg_ent *seg = anthy_get_nth_segment(seg_list, i); if (seg->mw_array) { /* 不正なメモリアクセスを行うバグの修正 */ qsort(seg->mw_array, seg->nr_metaword, sizeof(struct meta_word *), metaword_compare_func); } } }
sl_value sl_eval(struct sl_interpreter_state *state, sl_value expression, sl_value environment) { if (sl_type(expression) == state->tSymbol) { if (sl_env_has_key(state, environment, expression)) { return sl_env_get(state, environment, expression); } else { fprintf(stderr, "Error: `%s' is undefined\n", sl_string_cstring(state, sl_inspect(state, expression))); abort(); } } else if (sl_type(expression) != state->tList) { return expression; } else if (sl_empty(state, expression) == state->sl_true) { return expression; } else if (sl_type(sl_first(state, expression)) == state->tSymbol) { sl_value first = sl_first(state, expression); if (state->s_def == first) { assert(NUM2INT(sl_list_size(state, expression)) == 3); sl_value second = sl_second(state, expression); sl_value third = sl_third(state, expression); return sl_def(state, second, sl_eval(state, third, environment)); } else if (state->s_quote == first) { assert(NUM2INT(sl_list_size(state, expression)) == 2); return sl_second(state, expression); } else if (state->s_if == first) { assert(NUM2INT(sl_list_size(state, expression)) == 4); sl_value rest = sl_rest(state, expression); sl_value result = sl_eval(state, sl_first(state, rest), environment); if (result == state->sl_false) { return sl_eval(state, sl_third(state, rest), environment); } else { return sl_eval(state, sl_second(state, rest), environment); } } else if (state->s_annotate == first) { assert(NUM2INT(sl_list_size(state, expression)) == 3); sl_value val = sl_eval(state, sl_second(state, expression), environment); sl_value type = sl_eval(state, sl_third(state, expression), environment); assert(sl_type(val) == type); return val; } else { sl_value f = sl_eval(state, first, environment); sl_value new_expression = sl_list_new(state, f, sl_rest(state, expression)); return sl_eval(state, new_expression, environment); } } else if (sl_type(sl_first(state, expression)) == state->tFunction) { sl_value f = sl_first(state, expression); sl_value args = sl_rest(state, expression); /* TODO: make eval_each a map and eval */ return sl_apply(state, f, eval_each(state, args, environment)); } else { fprintf(stderr, "Error: %s is not implemented yet\n", sl_string_cstring(state, sl_inspect(state, expression))); abort(); } }