=================================================================== RCS file: /home/cvs/OpenXM_contrib2/asir2000/parse/eval.c,v retrieving revision 1.53 retrieving revision 1.55 diff -u -p -r1.53 -r1.55 --- OpenXM_contrib2/asir2000/parse/eval.c 2005/10/19 14:09:13 1.53 +++ OpenXM_contrib2/asir2000/parse/eval.c 2005/12/02 07:13:19 1.55 @@ -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.52 2005/10/19 04:52:59 noro Exp $ + * $OpenXM: OpenXM_contrib2/asir2000/parse/eval.c,v 1.54 2005/11/06 01:27:28 noro Exp $ */ #include #include "ca.h" @@ -508,6 +508,8 @@ FNODE partial_eval(FNODE f) { FNODE a0,a1,a2; NODE n; + Obj obj; + QUOTE q; pointer val; if ( !f ) @@ -540,10 +542,14 @@ 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); + a1 = mkfnode(2,f->id,FA0(f),a1); + obj = eval(a1); + objtoquote(obj,&q); + return BDY(q); + break; case I_LIST: case I_EV: n = partial_eval_node((NODE)FA0(f)); @@ -1211,7 +1217,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; @@ -1230,8 +1236,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; } }