=================================================================== RCS file: /home/cvs/OpenXM_contrib2/asir2018/parse/quote.c,v retrieving revision 1.1 retrieving revision 1.4 diff -u -p -r1.1 -r1.4 --- OpenXM_contrib2/asir2018/parse/quote.c 2018/09/19 05:45:08 1.1 +++ OpenXM_contrib2/asir2018/parse/quote.c 2021/03/11 09:20:49 1.4 @@ -1,4 +1,4 @@ -/* $OpenXM$ */ +/* $OpenXM: OpenXM_contrib2/asir2018/parse/quote.c,v 1.3 2021/03/11 03:41:13 noro Exp $ */ #include "ca.h" #include "parse.h" @@ -120,7 +120,7 @@ void objtoquote(Obj a,QUOTE *c) MKNODE(t1,BDY(nm),t); t = t1; } - STOQ(len,q); + STOZ(len,q); t = mknode(2,mkfnode(1,I_FORMULA,q),mkfnode(1,I_LIST,t)); gen_searchf("vector",&f); MKQUOTE(*c,mkfnode(2,I_FUNC,f,mkfnode(1,I_LIST,t))); @@ -143,8 +143,8 @@ void objtoquote(Obj a,QUOTE *c) } fn = mkfnode(1,I_LIST,t2); - STOQ(row,qrow); - STOQ(col,qcol); + STOZ(row,qrow); + STOZ(col,qcol); t = mknode(3, mkfnode(1,I_FORMULA,qrow),mkfnode(1,I_FORMULA,qcol),fn); gen_searchf("matrix",&f); @@ -291,7 +291,7 @@ void mptoquote(MP m,int n,QUOTE *r,int *sgn) } dl = m->dl; for ( i = n-1, t = 0; i >= 0; i-- ) { - STOQ(dl->d[i],q); + STOZ(dl->d[i],q); f = mkfnode(1,I_FORMULA,q); MKNODE(t1,f,t); t = t1; @@ -311,7 +311,9 @@ void vartoquote(V v,QUOTE *c) QUOTE a,b,u; int i; FUNC f; - NODE t,t1; + Z z; + FNODE fa,fd; + NODE t,t1,s,s1; if ( NAME(v) ) { MKV(v,x); @@ -335,19 +337,33 @@ void vartoquote(V v,QUOTE *c) objtoquote(ad[1].arg,&b); pwrquote(CO,a,b,c); } else { + gen_searchf(NAME(pf),&f); for ( i = 0; i < pf->argc; i++ ) if ( ad[i].d ) break; - if ( i < pf->argc ) - error("vartoquote : not implemented"); - gen_searchf(NAME(pf),&f); - t = 0; - for ( i = pf->argc-1; i >= 0; i-- ) { - objtoquote(ad[i].arg,&a); - MKNODE(t1,BDY(a),t); - t = t1; + if ( i < pf->argc ) { + t = s = 0; + for ( i = pf->argc-1; i >= 0; i-- ) { + objtoquote(ad[i].arg,&a); + MKNODE(t1,BDY(a),t); + t = t1; + STOZ(ad[i].d,z); + objtoquote((Obj)z,&a); + MKNODE(s1,BDY(a),s); + s = s1; + } + fa = mkfnode(1,I_LIST,t); + fd = mkfnode(1,I_LIST,s); + MKQUOTE(*c,mkfnode(3,I_PFDERIV,f,fa,fd)); + } else { + t = 0; + for ( i = pf->argc-1; i >= 0; i-- ) { + objtoquote(ad[i].arg,&a); + MKNODE(t1,BDY(a),t); + t = t1; + } + MKQUOTE(*c,mkfnode(2,I_FUNC,f,mkfnode(1,I_LIST,t))); } - MKQUOTE(*c,mkfnode(2,I_FUNC,f,mkfnode(1,I_LIST,t))); } } } @@ -378,7 +394,7 @@ struct fid_spec fid_spec_tab[] = { {I_IFUNC,A_fnode,A_fnode,A_end}, {I_MAP,A_func,A_fnode,A_end}, {I_RECMAP,A_func,A_fnode,A_end}, - {I_PFDERIV,A_notimpl,A_end}, + {I_PFDERIV,A_func,A_fnode,A_fnode,A_end}, {I_ANS,A_int,A_end}, {I_PVAR,A_int,A_node,A_end}, {I_ASSPVAR,A_fnode,A_fnode,A_end},