=================================================================== RCS file: /home/cvs/OpenXM_contrib2/asir2000/parse/eval.c,v retrieving revision 1.51 retrieving revision 1.56 diff -u -p -r1.51 -r1.56 --- OpenXM_contrib2/asir2000/parse/eval.c 2005/10/12 03:31:04 1.51 +++ 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.50 2005/10/05 09:39:13 noro Exp $ + * $OpenXM: OpenXM_contrib2/asir2000/parse/eval.c,v 1.55 2005/12/02 07:13:19 noro Exp $ */ #include #include "ca.h" @@ -445,6 +445,8 @@ FNODE fnode_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] = fnode_to_bin((FNODE)BDY(t),dir); @@ -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; @@ -538,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)); @@ -611,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); @@ -1204,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; @@ -1223,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; } }