Type* interp_arith(Type *type, Environment *env, int mode) { int num1 = 0; int num2 = 0; Type *node1 = (Type *) type->type1; Type *node2 = (Type *) type->type2; if (node1->type == VAR) { Type *t1 = lookup_env(env, (char *) node1->type1); if (t1 == NULL) { return NULL; } num1 = *(int *) t1->type1; } else if (node1->type == INT) { num1 = *(int *) node1->type1; } else { Type *rec = interp(node1, env); if (rec != NULL) { num1 = *(int *) rec->type1; } } if (node2->type == VAR) { Type *t2 = lookup_env(env, (char *) node2->type1); if (t2 == NULL) { return NULL; } num2 = *(int *) t2->type1; } else if (node2->type == INT) { num2 = *(int *) node2->type1; } else { Type *rec = interp(node2, env); if (rec != NULL) { num2 = *(int *) rec->type1; } } int *result = (int *) malloc(sizeof(int)); if (mode == ARITH_ADD) *result = num1 + num2; else if (mode == ARITH_SUB) *result = num1 - num2; else if (mode == ARITH_MULT) *result = num1 * num2; else *result = num1 / num2; Type *final = (Type *) malloc(sizeof(Type)); final->type = INT;
loliObj* loliSym::eval(loliObj* e){ this->type = typeSYM; if(this->name == "nil" || this == nil){ return nil; } if(this->name == "t" || this == t){ return t; } if(e->nilp() || e == NULL){ loliObj* r = lookup_top_env(this); if(r->nilp()){ loli_err("Symbol: " + this->toString() + " is unbound."); return nil; }else{ return lcons(r)->head(); } }else{ loliObj* r = lookup_env(this, e); if(r->nilp()){ loli_err("Symbol: " + this->toString() + " is unbound in its environment."); return nil; }else{ return lcons(r)->head(); } } }
/* return something like a group. */ char * getgr_name () { if (!group) /* have we been called before? */ group = lookup_env (group_strings); if (!group) /* have we been successful? */ group = anonymous; return group; }
/* return something like a username. */ char * getlogin () { /* This is how a windows user would override their login name. */ if (!login) login = lookup_env (login_strings); /* In the absence of user override, ask the operating system. */ if (!login) login = win32getlogin(); /* If all else fails, fall back on Old Faithful. */ if (!login) login = anonymous; return login; }