func_t *func_set_script(func_t *f) { strings *a=NULL,*b=NULL,*vlist=NULL; func_t *g=NULL; if(func_is_strings(f) && func_strings_size(f)==1){ if(str_match(func_strings_at(f,0),"=",BLK0,BLK1)){ a=strings_split(func_strings_at(f,0),"=",BLK0,BLK1,SPC); if(strings_size(a)==2 && str_match(strings_at(a,0),"^%A%I*$",BLK0,BLK1)){ g=func_set(func_def(strings_at(a,0),func_script(strings_at(a,1)),0,FUNC_NOLIMIT)); }else if(strings_size(a)==2 && str_match(strings_at(a,0),"^%A%I*(%m*)$",BLK0,BLK1)){ b=strings_split_mask(strings_at(a,0),BLK0,BLK1,SPC); if(strings_size(b)==1){ g=func_set(func_def(strings_at(b,0),func_script(strings_at(a,1)),0,0)); }else if(strings_size(b)>1){ vlist=strings_split(strings_at(b,1),",",BLK0,BLK1,SPC); func_scope_begin(func_strings_strings(vlist)); g=func_set(func_def(strings_at(b,0),func_eval(func_script(strings_at(a,1))),strings_size(vlist),strings_size(vlist))); func_scope_end(); } } } } if(g==NULL){ g=f; }else{ f=func_del(f); } a=strings_del(a); b=strings_del(b); vlist=strings_del(vlist); return g; }
void func_import_basic(int n) { func_init(); // default op for debug only func_scope_set(n,func_op_builtin_new()); func_scope_set(n,func_op_def_new()); func_scope_set(n,func_op_list_new()); func_scope_set(n,func_op_table_new()); func_scope_set(n,func_op_strings_new()); func_scope_set(n,func_op_scope_new()); // basic func_scope_set(n,func_op_nan_new()); func_scope_set(n,func_op_inf_new()); func_scope_set(n,func_op_zero_new()); func_scope_set(n,func_op_one_new()); func_scope_set(n,func_op_bigint_new()); func_scope_set(n,func_op_real_new()); func_scope_set(n,func_op_complex_new()); func_scope_set(n,func_op_var_new()); func_scope_set(n,func_op_add_new()); func_scope_set(n,func_op_mul_new()); func_scope_set(n,func_op_sqrt_new()); func_scope_set(n,func_op_exp_new()); func_scope_set(n,func_op_log_new()); func_scope_set(n,func_op_pow_new()); func_scope_set(n,func_op_sin_new()); func_scope_set(n,func_op_cos_new()); func_scope_set(n,func_op_tan_new()); func_scope_set(n,func_op_asin_new()); func_scope_set(n,func_op_acos_new()); func_scope_set(n,func_op_atan_new()); func_scope_set(n,func_op_sinh_new()); func_scope_set(n,func_op_cosh_new()); func_scope_set(n,func_op_tanh_new()); func_scope_set(n,func_op_asinh_new()); func_scope_set(n,func_op_acosh_new()); func_scope_set(n,func_op_atanh_new()); func_scope_set(n,func_op_ivec_new()); func_scope_set(n,func_op_rvec_new()); func_scope_set(n,func_op_cvec_new()); func_scope_set(n,func_op_rmat_new()); func_scope_set(n,func_op_cmat_new()); func_scope_set(n,func_op_begin_new()); func_scope_set(n,func_op_end_new()); func_scope_set(n,func_op_set_new()); func_scope_set(n,func_op_print_new()); func_scope_set(n,func_op_eval_new()); func_scope_set(n,func_op_evalf_new()); func_scope_set(n,func_op_expand_new()); func_scope_set(n,func_op_diff_new()); func_scope_set(n,func_op_grad_new()); func_scope_set(n,func_op_gbasis_new()); func_scope_set(n,func_def("I", func_complex_i(),0,0)); func_scope_set(n,func_def("i", func_sqrt(func_bigint_int(-1,1)),0,0)); func_scope_set(n,func_def("PI",func_mul(func_atan(func_one()),func_bigint_int(4,1)),0,0)); func_scope_set(n,func_def("Pi",func_mul(func_atan(func_one()),func_bigint_int(4,1)),0,0)); func_scope_set(n,func_def("pi",func_mul(func_atan(func_one()),func_bigint_int(4,1)),0,0)); }
obj eval(obj exp){ ev: assert(!! exp); obj rr,lt, rt; switch (exp->type) { case tInd: return doInd(eval(ult(exp)), ul(eval(urt(exp)))); case LIST: return List2v(evalList(ul(exp))); case tArray: return map_obj(eval, exp); case tAnd: return prod_eval(ul(exp), mult); case MULT: return prod_eval(ul(exp), mult); case ARITH: return prod_eval(ul(exp), add); case POW: return prod_eval(ul(exp), power); case DIVIDE: return prod_eval(ul(exp), divide); case tRef: return retain(uref(exp)); case tSymbol: if( macromode) { if(obj rr = search_assoc(car(macro_env), exp)){ macromode = false; // macro lexical scope should be pushed to the stack here rr = exec(rr); macromode = true; return rr; } } return eval_symbol(exp); case tMinus: lt = eval(uref(exp)); rr = uMinus(lt); // releasing if(rr) {release(lt); return rr;} static obj symumn = Symbol("-"); rr = udef_op0(symumn, lt); if(rr) {release(lt); return rr;} error("uMinus: not defined to that type"); case tReturn: if(! uref(exp)) return encap(tSigRet, nil); return encap(tSigRet, eval(uref(exp))); case tBreak: return retain(exp); case CONDITION: return evalCond(exp); case tOp: if(type(ult(exp)) ==tSymbol) { lt = search_assoc(curr_interp->types, ult(exp)); if(lt) return encap((ValueType)vrInt(lt), eval(urt(exp)));} lt = eval(ult(exp)); push(lt); switch(lt->type){ case tCont: assert(0); case tSpecial: rr = ufn(lt)(urt(exp)); break; case tSyntaxLam: rr = macro_exec(lt, urt(exp)); break; case tInternalFn: case tClosure: rt = eval(urt(exp)); rr = eval_function(lt, rt); break; default: rt = eval(urt(exp)); rr = call_fn(mult, lt, rt); release(rt); } release(pop(&is)); return rr; case tClosure: assert(0); case tCurry: return eval_curry(exp, em0(exp)); /* obj vars = Assoc(); bind_vars(&vars, em0(exp), em2(exp)); rr = eval_curry(exp, vars); release(vars); return rr; */ case tArrow: // return enclose(exp); /* if(macromode){ if(obj rr = search_assoc(car(macro_env), exp)){ } } */ return render(tClosure, list3(retain(em0(exp)), retain(em1(exp)), retain(env))); case tDefine: return func_def(em0(exp), em1(exp), em2(exp)); case tSyntaxDef: let(lfind_var(em0(exp)), render(tSyntaxLam, list3(retain(em1(exp)), retain(em2(exp)), nil))); return nil; case tExec: return exec(exp); case tAssign: lt = car(exp); if(type(lt)==tOp){ return func_def(ult(lt), urt(lt), cdr(exp)); } else if(type(lt)==tMinus){ static obj symumn = Symbol("-"); return func_def(symumn, uref(lt), cdr(exp)); } else return do_assign(lt, eval(cdr(exp))); case tIf: rr = eval(em0(exp)); if (type(rr) != INT) error("if: Boolean Expected"); if (vrInt(rr)) { rr = em1(exp); } else { rr = em2(exp); } return eval(rr); case tWhile: for(;;) { rr = eval(car(exp)); if (type(rr) != INT) error("while: Boolean expected"); if(!vrInt(rr)) break; rr = exec(cdr(exp)); if(rr && type(rr)==tSigRet) return rr; if(rr && type(rr)==tBreak) {release(rr); break;} if(rr) release(rr); } return nil; default: return retain(exp); } }