
%TEX
\subsection{Transform values Vxxx}
%

trans val(> node, > VValApply * avval* avpar,>empty): ->,
	trans val (> avpar, >avpar, >empty),
	trans val (> avval, >avval,>node);
trans val(> node, > VValApply * avval* avpar,>apply node): ->,
	trans val (> avpar, >avpar, >empty),
	trans val (> avval, >avval,>apply node);
trans val(> node, > VSym * symorig* sym  name, >apply node): ->,
	symbol application (>node, > sym orig, >sym name, >apply node);
trans val(> node, > VFlo * f, >apply node): ->,
	trans fnum (> f, >f),
        repair (>node,>ParFlo,>f);
trans val(> node, > VInt * int, >apply node): ->,
        repair (>node,>ParInt,>int);
trans val(> node, > VStr * s,>apply node): ->,
        repair (>node,>ParStr,>s);
trans val(> node, > VBool * b,>apply node): ->,
        repair (>node,>ParBool,>b);
trans val(> node, > VType * vttyp* vtval,>apply node): ->,
	trans typ (> vttyp, >vttyp),
	trans val (> vtval, >vtval, >empty);
trans val(> node, > VSysLambda * slpar* slval,>apply node): ->,
        repair (>node,>VLambda,>slpar*sl val),
	trans formcon (> slpar, >slpar),
	trans val (> slval, >slval, >empty);
trans val(> node, > VSysSigma * sspar* ssval,>apply node): ->,
        repair (>node,>VSigma,>sspar*ss val),
	trans formcon (> sspar, >sspar),
	trans val (> ssval, >ssval, >empty);
trans val(> node, > VSysApply * asval* aspar,>apply node): ->,
        where (>node,vsysapply*rest>),
        repair (>node,>VApply,>rest),
	trans val (> aspar, >aspar, >empty),
	trans val (> asval, >asval, >node);
trans val(> node, > VWhere * wdefs* wval,>apply node): ->,
	trans def list (> wdefs, >wdefs),
	trans val (> wval, >wval, >empty);
trans val(> node, > VList * l,>apply node): ->,
	trans val list (> l, >l,>empty);
trans val(> node, > VAppset * aps,>apply node): ->,
	trans val list (> aps, >aps,>empty);
trans val(> node, > VAtom * atomnm,>apply node): ->;
trans val(> node, > VSyn * synlist,>apply node): ->,
	trans val list (> synlist, >synlist,>empty);
trans val(> node, > VBuiltin * oper* args,>apply node): 
        where (>oper, STRING* ":">), ->,
        where (>args, LIST*a*b*_>),
        repair (>node,>VComp,>a*b),
        trans val (>a,>a ,>empty),
        trans val (>b,>b ,>empty);
trans val(> node, > VBuiltin * oper* args,>apply node): 
        where (>oper, STRING* "->">),
        where (>args, LIST*cond*then part*else part*_>),
        trans val (>cond,>cond,>empty),
        where (>cond, ParBool  * BOOL * Bool>),
        condition (>Bool,>then part,>else part, chosen part>),
        trans val (>chosen part,>chosen part,>empty),
        where (>chosen part, p name* p args>),
        repair (>node,>p name,>p args), ->;
trans val(> node, > VBuiltin * oper* args,>apply node):  ->,
	trans val list (> args, >args,>empty),
        where (>oper, STRING* operator>),
        where (>args, LIST*a>),
        builtin (>apply node,>operator,>node,>a);
trans val (> x,> y,>apply node):.


%TEX
\subsubsection{Builtin applications.}
%

builtin (>apply node,>"[]",>node,>args): 
    where (>args,els*i*_>),
    where (>i, ParInt*I NUM* index nr>),
    index (>index nr,>els ,index el>),
    where (>index el, pp name* pp args>),
    repair (>node,>pp name,>pp args), 
    trans val (>index el,>index el,>apply node), ->;
builtin (>apply node, >"[..]",>node,>args): 
    where (>args,els*i*j*_>),
    where (>i,ParInt* I NUM  * lwb>),
    where (>j,ParInt* I NUM  * upb>),
    slice (>lwb,>upb,>els ,slice n* slicev>),
    repair (>node,>slice n,>slice v), ->;
builtin (>apply node, > INT INT to INT,>node,>args):
    int int to int(>INT INT to INT,>args,>node), ->;
builtin (>apply node, > FLOAT FLOAT to FLOAT,>node,>args):
    float float to float(>FLOAT FLOAT to FLOAT,>args,>node), ->;
builtin (>apply node, > A A to BOOL,>node,>args):
    a a to bool(>A A to BOOL,>args,>node), ->;
builtin (>apply node, > BOOL BOOL to BOOL,>node,>args):
    bool bool to bool(>BOOL BOOL to BOOL,>args,>node), ->;
builtin (>apply node, > "/",>node,>args):
    a a to float(>args,>node), ->;
builtin (>apply node, > "DIV",>node,>args):
    a a to int(>args,>node), ->;
builtin (>apply node, > "=",>node,>args):
    x equal (>args,>node), ->;
builtin (>apply node, > "+1",>node,>fi * r *_): 
    repair (>node,>fi,>r), ->;
builtin (>apply node, > "-1",>node,>i V f *_):
    where (>i V f , i V f cs  * val ce>),
    where (>val ce, I or F NUM * num>),
    umin (>num, umin>),
    repair (>val ce,>I or F NUM ,>umin), 
    repair (>node,>i V f cs,>val ce), ->;
builtin (>apply node, > "itof",>node,>par float * _ ): 
    where (>par float, par float cs * val ce>),
    where (>val ce, F NUM * num>),
    int of float (>num, int of float>),
    repair (>val ce,>I NUM ,>int of float), 
    repair (>node,>ParInt,>val ce), ->;
builtin (>apply node, >builtin,>v,>args):
     repair (>v,>VErr, >STRING*errmsg),
     trace meta ds (>args,up args>),
     where (>"*** Erroneous application of operator `"+ builtin+ "' at: " + up args, 
             errmsg>).
