Esempio n. 1
0
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;
}
Esempio n. 2
0
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));
}
Esempio n. 3
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);
	}
}