=================================================================== RCS file: /home/cvs/OpenXM_contrib2/asir2000/builtin/pf.c,v retrieving revision 1.12 retrieving revision 1.18 diff -u -p -r1.12 -r1.18 --- OpenXM_contrib2/asir2000/builtin/pf.c 2005/10/05 07:38:08 1.12 +++ OpenXM_contrib2/asir2000/builtin/pf.c 2013/06/14 04:47:17 1.18 @@ -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/builtin/pf.c,v 1.11 2005/09/27 03:00:21 noro Exp $ + * $OpenXM: OpenXM_contrib2/asir2000/builtin/pf.c,v 1.17 2011/09/14 06:41:20 noro Exp $ */ #include "ca.h" #include "math.h" @@ -62,17 +62,19 @@ void make_itri(void); void make_tri(void); void make_exp(void); void simplify_pow(PFINS,Obj *); +FNODE partial_eval(FNODE f); void Pfunctor(),Pargs(),Pfunargs(),Pvtype(),Pcall(),Pdeval(),Pfunargs_ext(); void Pregister_handler(); void Peval_quote(); -void Pmapat(); +void Pmapat(), Pmap(); void Padd_handler(); void Plist_handler(); void Pclear_handler(); struct ftab puref_tab[] = { {"mapat",Pmapat,-99999999}, + {"map",Pmap,-99999999}, {"functor",Pfunctor,1}, {"args",Pargs,1}, {"funargs",Pfunargs,1}, @@ -563,6 +565,11 @@ void Pcall(NODE arg,Obj *rp) { P p; V v; + NODE n,n1; + LIST list; + VECT vect; + pointer *a; + int len,i; p = (P)ARG0(arg); if ( !p || OID(p) != 2 ) @@ -570,9 +577,26 @@ void Pcall(NODE arg,Obj *rp) v = VR(p); if ( (int)v->attr != V_SR ) error("call : no such function"); - - else - *rp = (Obj)bevalf((FUNC)v->priv,BDY((LIST)ARG1(arg))); + else { + list = (LIST) ARG1(arg); + if ( list ) { + switch (OID(list)) { + case O_VECT: + vect = (VECT)list; len = vect->len; a = BDY(vect); + for ( i = len - 1, n = 0; i >= 0; i-- ) { + MKNODE(n1,a[i],n); n = n1; + } + MKLIST(list,n); + /* falling next case */ + case O_LIST: + *rp = (Obj)bevalf_with_opts((FUNC)v->priv,BDY(list),current_option); + return; + default: + break; + } + } + error("call : invalid argument"); + } } /* at=position of arg to be used for iteration */ @@ -590,7 +614,10 @@ void Pmapat(NODE arg,Obj *rp) int len,row,col,i,j,pos; Obj iter; pointer val; + NODE option; + option = current_option; + if ( argc(arg) < 3 ) error("mapat : too few arguments"); @@ -615,7 +642,7 @@ void Pmapat(NODE arg,Obj *rp) NEXTNODE(r0,r); iter = BDY(t); rest = NEXT(t); if ( !iter ) { - *rp = bevalf(f,node); + *rp = bevalf_with_opts(f,node,option); return; } switch ( OID(iter) ) { @@ -623,7 +650,7 @@ void Pmapat(NODE arg,Obj *rp) v = (VECT)iter; len = v->len; MKVECT(rv,len); for ( i = 0; i < len; i++ ) { BDY(r) = BDY(v)[i]; NEXT(r) = rest; - BDY(rv)[i] = bevalf(f,r0); + BDY(rv)[i] = bevalf_with_opts(f,r0,option); } *rp = (Obj)rv; break; @@ -632,7 +659,7 @@ void Pmapat(NODE arg,Obj *rp) for ( i = 0; i < row; i++ ) for ( j = 0; j < col; j++ ) { BDY(r) = BDY(m)[i][j]; NEXT(r) = rest; - BDY(rm)[i][j] = bevalf(f,r0); + BDY(rm)[i][j] = bevalf_with_opts(f,r0,option); } *rp = (Obj)rm; break; @@ -640,7 +667,7 @@ void Pmapat(NODE arg,Obj *rp) n = BDY((LIST)iter); for ( t0 = t = 0; n; n = NEXT(n) ) { BDY(r) = BDY(n); NEXT(r) = rest; - NEXTNODE(t0,t); BDY(t) = bevalf(f,r0); + NEXTNODE(t0,t); BDY(t) = bevalf_with_opts(f,r0,option); } if ( t0 ) NEXT(t) = 0; @@ -648,7 +675,81 @@ void Pmapat(NODE arg,Obj *rp) *rp = (Obj)rl; break; default: - *rp = bevalf(f,node); + *rp = bevalf_with_opts(f,node,option); + break; + } +} + +/* An implementation of 'map' as builtin function. */ +void Pmap(NODE arg,Obj *rp) +{ + LIST args; + NODE node,rest,t0,t,n,r,r0; + P fpoly; + V fvar; + FUNC f; + VECT v,rv; + MAT m,rm; + LIST rl; + int len,row,col,i,j; + Obj iter; + pointer val; + NODE option; + + option = current_option; + + if ( argc(arg) < 2 ) + error("mapat : too few arguments"); + + fpoly = (P)ARG0(arg); + if ( !fpoly || OID(fpoly) != O_P ) + error("map : invalid function specification"); + fvar = VR(fpoly); + if ( fvar->attr != (pointer)V_SR || !(f=(FUNC)fvar->priv) ) + error("map : invalid function specification"); + + node = NEXT(arg); + len = length(node); + if ( 0 >= len ) + error("evalmapf : invalid position"); + r0 = 0; + NEXTNODE(r0,r); + iter = BDY(node); rest = NEXT(node); + if ( !iter ) { + *rp = bevalf_with_opts(f,node,option); + return; + } + switch ( OID(iter) ) { + case O_VECT: + v = (VECT)iter; len = v->len; MKVECT(rv,len); + for ( i = 0; i < len; i++ ) { + BDY(r) = BDY(v)[i]; NEXT(r) = rest; + BDY(rv)[i] = bevalf_with_opts(f,r0,option); + } + *rp = (Obj)rv; + break; + case O_MAT: + m = (MAT)iter; row = m->row; col = m->col; MKMAT(rm,row,col); + for ( i = 0; i < row; i++ ) + for ( j = 0; j < col; j++ ) { + BDY(r) = BDY(m)[i][j]; NEXT(r) = rest; + BDY(rm)[i][j] = bevalf_with_opts(f,r0,option); + } + *rp = (Obj)rm; + break; + case O_LIST: + n = BDY((LIST)iter); + for ( t0 = t = 0; n; n = NEXT(n) ) { + BDY(r) = BDY(n); NEXT(r) = rest; + NEXTNODE(t0,t); BDY(t) = bevalf_with_opts(f,r0,option); + } + if ( t0 ) + NEXT(t) = 0; + MKLIST(rl,t0); + *rp = (Obj)rl; + break; + default: + *rp = bevalf_with_opts(f,node,option); break; } }