Exemple #1
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;
}
Exemple #2
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));
}
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;

}
const char *sexpression_to_json_string(cell *exp) {
    char * res = malloc(1024);
    sprintf(res, "[");
    const char * resChild;
    while (exp) {
        cellValue value = cell_car_value(exp);
        switch (cell_car_type(exp)) {
            case typeDouble:
                sprintf(res+strlen(res), "%g", value.doubleValue);
                break;
            case typeLong:
                sprintf(res+strlen(res), "%ld", value.longValue);
                break;
            case typeNil:
                sprintf(res+strlen(res), "null");
                break;
            case typeString:
                sprintf(res+strlen(res), "\"%s\"", value.stringValue);
                break;
            case typeCell:
                
                resChild = sexpression_to_json_string(value.cellValue);
                sprintf(res+strlen(res), "%s", resChild);
                free((void *)resChild);

                break;
            case typeOp:
                sprintf(res+strlen(res), "<%s>", make_string_from_op(value.opValue));
                break;

            default:
                break;
        }
        
        exp = cell_cdr(exp);
        if (exp) {
            sprintf(res+strlen(res), ", ");
        }
    }
    
    sprintf(res+strlen(res), "]");

    return res;
}