Пример #1
0
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;
}
Пример #2
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));
        }
}
Пример #3
0
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);
    }
  }
}
Пример #4
0
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();
        }
}