OBJ lookup_variable_value(OBJ name,OBJ env) { OBJ find; while(!nullp(env)) { find = assq(name,env_frame(env)); if(!nullp(find)) return cdr(find); env = env_base(env); } if(find == OBJ_NULL) fprintf(stderr,"undefined variable:%s\n",obj_symbol_data(name)); return OBJ_NULL; }
static OBJ analyze_variable_cell(OBJ variable,OBJ env,int macro,OBJ params,OBJ macro_expand_env) { OBJ tmp; OBJ ret; if(macro) { tmp = assq(variable,params); if(nullp(tmp)) /* if variable isn't params of macro,lookup it at macro_define_env */ ret = lookup_variable_cell(variable,env); else /* otherwise lookup variable at macro_expand_env...ie,current env */ ret = lookup_variable_cell(cdr(tmp),macro_expand_env); } else ret = lookup_variable_cell(variable, env); return ret; }
OBJ define(OBJ name,OBJ value,OBJ env) { OBJ find; find = assq(name,env_frame(env)); if(find == OBJ_NULL) { find = cons(name,value); env_frame(env) = cons(find,env_frame(env)); } else { cdr(find) = value; } return find; }
static long longfield(char *name,LISP alist) {LISP value,key = rintern(name); if NULLP(value = assq(key,alist)) return(0); return(get_c_long(cdr(value)));}
static char *strfield(char *name,LISP alist) {LISP value,key = rintern(name); if NULLP(value = assq(key,alist)) return(""); return(get_c_string(cdr(value)));}