=================================================================== RCS file: /home/cvs/OpenXM_contrib2/asir2000/parse/eval.c,v retrieving revision 1.49 retrieving revision 1.56 diff -u -p -r1.49 -r1.56 --- OpenXM_contrib2/asir2000/parse/eval.c 2005/10/05 07:38:08 1.49 +++ OpenXM_contrib2/asir2000/parse/eval.c 2005/12/09 08:10:44 1.56 @@ -45,7 +45,7 @@ * DEVELOPER SHALL HAVE NO LIABILITY IN CONNECTION WITH THE USE, * PERFORMANCE OR NON-PERFORMANCE OF THE SOFTWARE. * - * $OpenXM: OpenXM_contrib2/asir2000/parse/eval.c,v 1.48 2005/09/30 01:35:25 noro Exp $ + * $OpenXM: OpenXM_contrib2/asir2000/parse/eval.c,v 1.55 2005/12/02 07:13:19 noro Exp $ */ #include #include "ca.h" @@ -351,10 +351,10 @@ pointer eval(FNODE f) return ( val ); } -NODE quote_to_nary_node(NODE); -NODE quote_to_bin_node(NODE,int); +NODE fnode_to_nary_node(NODE); +NODE fnode_to_bin_node(NODE,int); -FNODE quote_to_nary(FNODE f) +FNODE fnode_to_nary(FNODE f) { FNODE a0,a1,a2; NODE n,t,t0; @@ -365,12 +365,12 @@ FNODE quote_to_nary(FNODE f) return f; switch ( f->id ) { case I_NARYOP: - n = quote_to_nary_node((NODE)FA1(f)); + n = fnode_to_nary_node((NODE)FA1(f)); return mkfnode(2,I_NARYOP,FA0(f),n); case I_BOP: - a1 = quote_to_nary((FNODE)FA1(f)); - a2 = quote_to_nary((FNODE)FA2(f)); + a1 = fnode_to_nary((FNODE)FA1(f)); + a2 = fnode_to_nary((FNODE)FA2(f)); op = ((ARF)FA0(f))->name; if ( !strcmp(op,"+") || !strcmp(op,"*") ) { if ( a1->id == I_NARYOP && !strcmp(op,((ARF)FA0(a1))->name) ) { @@ -392,45 +392,45 @@ FNODE quote_to_nary(FNODE f) case I_NOT: case I_PAREN: case I_MINUS: case I_CAR: case I_CDR: - a0 = quote_to_nary((FNODE)FA0(f)); + a0 = fnode_to_nary((FNODE)FA0(f)); return mkfnode(1,f->id,a0); case I_COP: case I_LOP: - a1 = quote_to_nary((FNODE)FA1(f)); - a2 = quote_to_nary((FNODE)FA2(f)); + a1 = fnode_to_nary((FNODE)FA1(f)); + a2 = fnode_to_nary((FNODE)FA2(f)); return mkfnode(3,f->id,FA0(f),a1,a2); case I_AND: case I_OR: - a0 = quote_to_nary((FNODE)FA0(f)); - a1 = quote_to_nary((FNODE)FA1(f)); + a0 = fnode_to_nary((FNODE)FA0(f)); + a1 = fnode_to_nary((FNODE)FA1(f)); return mkfnode(2,f->id,a0,a1); /* ternary operators */ case I_CE: - a0 = quote_to_nary((FNODE)FA0(f)); - a1 = quote_to_nary((FNODE)FA1(f)); - a2 = quote_to_nary((FNODE)FA2(f)); + a0 = fnode_to_nary((FNODE)FA0(f)); + a1 = fnode_to_nary((FNODE)FA1(f)); + a2 = fnode_to_nary((FNODE)FA2(f)); return mkfnode(3,f->id,a0,a1,a2); break; /* function */ case I_FUNC: - a1 = quote_to_nary((FNODE)FA1(f)); + a1 = fnode_to_nary((FNODE)FA1(f)); return mkfnode(2,f->id,FA0(f),a1); case I_LIST: case I_EV: - n = quote_to_nary_node((NODE)FA0(f)); + n = fnode_to_nary_node((NODE)FA0(f)); return mkfnode(1,f->id,n); case I_STR: case I_FORMULA: case I_PVAR: return f; default: - error("quote_to_nary : not implemented yet"); + error("fnode_to_nary : not implemented yet"); } } -FNODE quote_to_bin(FNODE f,int dir) +FNODE fnode_to_bin(FNODE f,int dir) { FNODE a0,a1,a2; NODE n,t; @@ -445,9 +445,11 @@ FNODE quote_to_bin(FNODE f,int dir) case I_NARYOP: fun = (ARF)FA0(f); len = length((NODE)FA1(f)); + if ( len==1 ) return BDY((NODE)(FA1(f))); + arg = (FNODE *)ALLOCA(len*sizeof(FNODE)); for ( i = 0, t = (NODE)FA1(f); i < len; i++, t = NEXT(t) ) - arg[i] = quote_to_bin((FNODE)BDY(t),dir); + arg[i] = fnode_to_bin((FNODE)BDY(t),dir); if ( dir ) { a2 = mkfnode(3,I_BOP,fun,arg[len-2],arg[len-1]); for ( i = len-3; i >= 0; i-- ) @@ -461,41 +463,41 @@ FNODE quote_to_bin(FNODE f,int dir) case I_NOT: case I_PAREN: case I_MINUS: case I_CAR: case I_CDR: - a0 = quote_to_bin((FNODE)FA0(f),dir); + a0 = fnode_to_bin((FNODE)FA0(f),dir); return mkfnode(1,f->id,a0); case I_BOP: case I_COP: case I_LOP: - a1 = quote_to_bin((FNODE)FA1(f),dir); - a2 = quote_to_bin((FNODE)FA2(f),dir); + a1 = fnode_to_bin((FNODE)FA1(f),dir); + a2 = fnode_to_bin((FNODE)FA2(f),dir); return mkfnode(3,f->id,FA0(f),a1,a2); case I_AND: case I_OR: - a0 = quote_to_bin((FNODE)FA0(f),dir); - a1 = quote_to_bin((FNODE)FA1(f),dir); + a0 = fnode_to_bin((FNODE)FA0(f),dir); + a1 = fnode_to_bin((FNODE)FA1(f),dir); return mkfnode(2,f->id,a0,a1); /* ternary operators */ case I_CE: - a0 = quote_to_bin((FNODE)FA0(f),dir); - a1 = quote_to_bin((FNODE)FA1(f),dir); - a2 = quote_to_bin((FNODE)FA2(f),dir); + a0 = fnode_to_bin((FNODE)FA0(f),dir); + a1 = fnode_to_bin((FNODE)FA1(f),dir); + a2 = fnode_to_bin((FNODE)FA2(f),dir); return mkfnode(3,f->id,a0,a1,a2); break; /* function */ case I_FUNC: - a1 = quote_to_bin((FNODE)FA1(f),dir); + a1 = fnode_to_bin((FNODE)FA1(f),dir); return mkfnode(2,f->id,FA0(f),a1); case I_LIST: case I_EV: - n = quote_to_bin_node((NODE)FA0(f),dir); + n = fnode_to_bin_node((NODE)FA0(f),dir); return mkfnode(1,f->id,n); case I_STR: case I_FORMULA: case I_PVAR: return f; default: - error("quote_to_bin : not implemented yet"); + error("fnode_to_bin : not implemented yet"); } } @@ -506,7 +508,10 @@ FNODE partial_eval(FNODE f) { FNODE a0,a1,a2; NODE n; + Obj obj; + QUOTE q; pointer val; + FUNC func; if ( !f ) return f; @@ -521,6 +526,10 @@ FNODE partial_eval(FNODE f) a2 = partial_eval((FNODE)FA2(f)); return mkfnode(3,f->id,FA0(f),a1,a2); + case I_NARYOP: + n = partial_eval_node((NODE)FA1(f)); + return mkfnode(2,f->id,FA0(f),n); + case I_AND: case I_OR: a0 = partial_eval((FNODE)FA0(f)); a1 = partial_eval((FNODE)FA1(f)); @@ -534,10 +543,19 @@ FNODE partial_eval(FNODE f) return mkfnode(3,f->id,a0,a1,a2); break; - /* function */ + /* XXX : function is evaluated */ case I_FUNC: a1 = partial_eval((FNODE)FA1(f)); - return mkfnode(2,f->id,FA0(f),a1); + func = (FUNC)FA0(f); + a1 = mkfnode(2,f->id,func,a1); + if ( func->id == A_UNDEF ) + return a1; + else { + obj = eval(a1); + objtoquote(obj,&q); + return BDY(q); + } + break; case I_LIST: case I_EV: n = partial_eval_node((NODE)FA0(f)); @@ -607,7 +625,12 @@ FNODE rewrite_fnode(FNODE f,NODE arg) return mkfnode(3,f->id,a0,a1,a2); break; - /* function */ + /* nary operators */ + case I_NARYOP: + n = rewrite_fnode_node((NODE)FA1(f),arg); + return mkfnode(2,f->id,FA0(f),n); + + /* and function */ case I_FUNC: a1 = rewrite_fnode((FNODE)FA1(f),arg); return mkfnode(2,f->id,FA0(f),a1); @@ -648,25 +671,25 @@ NODE rewrite_fnode_node(NODE n,NODE arg) return r0; } -NODE quote_to_nary_node(NODE n) +NODE fnode_to_nary_node(NODE n) { NODE r0,r,t; for ( r0 = 0, t = n; t; t = NEXT(t) ) { NEXTNODE(r0,r); - BDY(r) = quote_to_nary((FNODE)BDY(t)); + BDY(r) = fnode_to_nary((FNODE)BDY(t)); } if ( r0 ) NEXT(r) = 0; return r0; } -NODE quote_to_bin_node(NODE n,int dir) +NODE fnode_to_bin_node(NODE n,int dir) { NODE r0,r,t; for ( r0 = 0, t = n; t; t = NEXT(t) ) { NEXTNODE(r0,r); - BDY(r) = quote_to_bin((FNODE)BDY(t),dir); + BDY(r) = fnode_to_bin((FNODE)BDY(t),dir); } if ( r0 ) NEXT(r) = 0; return r0; @@ -1179,14 +1202,17 @@ pointer bevalf(FUNC f,NODE a) pointer evalif(FNODE f,FNODE a) { Obj g; + QUOTE q; FNODE t; + LIST l; g = (Obj)eval(f); if ( g && (OID(g) == O_P) && (VR((P)g)->attr == (pointer)V_SR) ) return evalf((FUNC)VR((P)g)->priv,a,0); else if ( g && OID(g) == O_QUOTEARG && ((QUOTEARG)g)->type == A_func ) { t = mkfnode(2,I_FUNC,((QUOTEARG)g)->body,a); - return eval(t); + MKQUOTE(q,t); + return q; } else { error("invalid function pointer"); /* NOTREACHED */ @@ -1197,7 +1223,7 @@ pointer evalif(FNODE f,FNODE a) pointer evalpf(PF pf,NODE args,NODE dargs) { Obj s,s1; - int i; + int i,di,j; NODE node,dnode; PFINS ins; PFAD ad; @@ -1216,8 +1242,16 @@ pointer evalpf(PF pf,NODE args,NODE dargs) } simplify_ins(ins,&s); } else { - for ( i = 0, s = pf->body, node = args; - node; node = NEXT(node), i++ ) { + s = pf->body; + if ( dnode ) { + for ( i = 0, dnode = dargs; dnode; dnode = NEXT(dnode), i++ ) { + di = QTOS((Q)dnode->body); + for ( j = 0; j < di; j++ ) { + derivr(CO,s,pf->args[i],&s1); s = s1; + } + } + } + for ( i = 0, node = args; node; node = NEXT(node), i++ ) { substr(CO,0,s,pf->args[i],(Obj)node->body,&s1); s = s1; } }