Beispiel #1
0
/* modify the environment to make a new binding in the first frame */
void env_bind(Cell *env, Cell *name, Cell *val) {
    Cell *frame, *names, *vals;

    EnvTrace fprintf(stderr, "env_bind(%s, %s, %s)\n",
            cell_asprint(env), cell_asprint(val), cell_asprint(name));
    if (cell_atomp(name)) {
	name = cell_cons(name, cell_nil);
	EnvTrace fprintf(stderr, "env_bind(): name enlisted to %s\n",
                cell_asprint(name));
    }
    val = cell_cons(val, cell_nil);

    frame = cell_car_cell(env);
    EnvTrace fprintf(stderr, "env_bind(): frame is %s\n", cell_asprint(frame));
    names = frame ? cell_car_cell(frame) : cell_nil;
    vals = frame ? cell_cdr(frame) : cell_nil;
    EnvTrace fprintf(stderr, "env_bind(): old-names is %s\n",
            cell_asprint(names));
    list_appendM(name, names);
    EnvTrace fprintf(stderr, "env_bind(): out-names is %s\n",
            cell_asprint(name));
    list_appendM(val, vals);
    EnvTrace fprintf(stderr, "env_bind(): out-vals is %s\n",
            cell_asprint(val));
    cell_car_set(frame, name);
    cell_cdr_set(frame, val);
    //EnvTrace fprint(stderr, "env_bind(): frame is %O\n", frame);
    EnvTrace fprintf(stderr, "env_bind(): out-env is %s\n", cell_asprint(env));
}
Beispiel #2
0
/* attach a new frame to an environment */
Cell *env_frame(Cell *env, Cell *names, Cell *values) {
    Cell *frame = cell_cons(names, values);
    assert(cell_nullp(names) || cell_pairp(names));
    assert(cell_nullp(values) || cell_pairp(values));
    EnvTrace fprintf(stderr, "env_frame(): env is %s\n",
            cell_asprint(env));
    EnvTrace fprintf(stderr, "env_frame(): names is %s\n",
            cell_asprint(names));
    EnvTrace fprintf(stderr, "env_frame(): values is %s\n",
            cell_asprint(values));
    env = cell_cons(frame, env);
    return env;
}
void *sexpression_from_json_token(jsmntok_t t[1024], const char* json_string, int *json_element_size) {
    
    jsmntok_t token = t[0];
    if (token.type != JSMN_ARRAY) {
        printf("ERROR in parsing!");
        return NULL;
    }

    if (token.type == JSMN_ARRAY) {
        *json_element_size = token.size;
        
//        char * valueBuff = malloc(token.end - token.start+1);
//        strlcpy(valueBuff, json_string + token.start, token.end - token.start+1);
//        printf("PROCESSING array %s  \n", valueBuff);

        int j = 1;
        int child_elements_size =0;
        cell *c = NULL;

        while (j<=token.size) {
            int child_json_element_size;
            jsmntok_t *next_tokens = t+j+child_elements_size;
            
            
            if (next_tokens[0].type == JSMN_ARRAY) {
                cell *child = sexpression_from_json_token(next_tokens, json_string, &child_json_element_size);
                child_elements_size += child_json_element_size;
                cellValue cellv;
                cellv.cellValue = child;
                c = cell_cons(cellv, typeCell, c);
            } else {
                cellType type = typeNil;
                cellValue a = atom_from_json_token(next_tokens[0], json_string, &type);
                c = cell_cons(a, type, c);
            }
            j ++;

        }
        *json_element_size += child_elements_size;
        cell* curr = c;
        cell* reversed_cell = NULL;
        do {
            reversed_cell = cell_cons(cell_car_value(curr), cell_car_type(curr), reversed_cell);
        } while (((curr = cell_cdr(curr))));
        return reversed_cell;
    }

    
    return NULL;

}
Beispiel #4
0
/* Lookup a name in an environment. The value is returned as a singleton
 * list: this allows the caller to distinguish between an unbound name:
 * lookup returns (); and a name bound to the empty list: lookup returns
 * (()).
 */
Cell *env_lookup(Cell *env, Cell *name) {
    char *tgt = cell_car_string(name);
    Cell *e;

    EnvTrace fprintf(stderr, "env_lookup(%s, %s)\n", cell_asprint(env), tgt);
    for (e = env; e; e = cell_cdr(e)) {
	Cell *f, *ns, *vs;
       
        f = cell_car_cell(e);
        assert(f);
	ns = cell_car_cell(f);
	vs = cell_cdr(f);
	EnvTrace fprintf(stderr, "env_lookup(): ns is %s\n",
                cell_asprint(ns));
	EnvTrace fprintf(stderr, "env_lookup(): vs is %s\n",
                cell_asprint(vs));
	Cell *n, *v;
	for (n = ns, v = vs; n; n = cell_cdr(n), v = cell_cdr(v))
	    if (streq(cell_car_string(n), tgt)) {
                EnvTrace fprintf(stderr, "env_lookup(): returning %s\n",
                        cell_asprint(cell_car(v)));
		return cell_cons(cell_car(v), cell_nil);
            }
    }
    EnvTrace fprintf(stderr, "env_lookup(): no binding found for %s\n", tgt);
    return cell_nil;
}
Beispiel #5
0
void test_flatten(void) {
    Cell *c, *t;
    char *s;
        
    c = cell_nil;
    check(cell_nullp(tree_flatten(c)));

    c = cell_cons_string("one", cell_nil);
    t = tree_flatten(c);
    s = cell_asprint(t);
    fprintf(stderr, "tree_flatten %s ==> %s\n", cell_asprint(c), s);
    check(streq(s, "(one)"));

    c = cell_cons_string("two", c);
    t = tree_flatten(c);
    s = cell_asprint(t);
    fprintf(stderr, "tree_flatten %s ==> %s\n", cell_asprint(c), s);
    check(streq(s, "(two one)"));

    c = cell_cons(c, cell_nil);
    t = tree_flatten(c);
    s = cell_asprint(t);
    fprintf(stderr, "tree_flatten %s ==> %s\n", cell_asprint(c), s);
    check(streq(s, "(two one)"));

    c = cell_cons_string("three", c);
    t = tree_flatten(c);
    s = cell_asprint(t);
    fprintf(stderr, "tree_flatten %s ==> %s\n", cell_asprint(c), s);
    check(streq(s, "(three two one)"));

    c = cell_cons(c, c);
    t = tree_flatten(c);
    s = cell_asprint(t);
    fprintf(stderr, "tree_flatten %s ==> %s\n", cell_asprint(c), s);
    check(streq(s, "(three two one three two one)"));

    c = fbbq();
    c = cell_cons(cell_nil, c);
    t = tree_flatten(c);
    s = cell_asprint(t);
    fprintf(stderr, "tree_flatten %s ==> %s\n", cell_asprint(c), s);
    check(streq(s, "(foo bar baz qux)"));
}