/**************************************************************************** ** *FSumIntVector(<elmL>,<vecR>).......sumofanintegerandavector ** **'SumIntVector'returnsthesumoftheinteger<elmL>andthevector **<vecR>.Thesumisalist,whereeachelementisthesumof<elmL>and **thecorrespondingelementof<vecR>. ** **'SumIntVector'isanimprovedversionof'SumSclList',whichdoesnot **call'SUM'iftheoperandsareimmediateintegers.
*/ static Obj SumIntVector(Obj elmL, Obj vecR)
{
Obj vecS; // handle of the sum
Obj * ptrS; // pointer into the sum
Obj elmS; // one element of sum list const Obj * ptrR; // pointer into the right operand
Obj elmR; // one element of right operand
UInt len; // length
UInt i; // loop variable
// make the result list
len = LEN_PLIST(vecR);
vecS = NEW_PLIST(TNUM_OBJ(vecR), len);
SET_LEN_PLIST(vecS, len);
// loop over the elements and add
ptrR = CONST_ADDR_OBJ(vecR);
ptrS = ADDR_OBJ(vecS); for (i = 1; i <= len; i++) {
elmR = ptrR[i]; if (! ARE_INTOBJS(elmL, elmR) || ! SUM_INTOBJS(elmS, elmL, elmR)) {
elmS = SUM(elmL, elmR);
ptrR = CONST_ADDR_OBJ(vecR);
ptrS = ADDR_OBJ(vecS);
ptrS[i] = elmS;
CHANGED_BAG(vecS);
} else
ptrS[i] = elmS;
}
return vecS;
}
/**************************************************************************** ** *FSumVectorInt(<vecL>,<elmR>).......sumofavectorandaninteger ** **'SumVectorInt'returnsthesumofthevector<vecL>andtheinteger **<elmR>.Thesumisalist,whereeachelementisthesumof<elmR>and **thecorrespondingelementof<vecL>. ** **'SumVectorInt'isanimprovedversionof'SumListScl',whichdoesnot **call'SUM'iftheoperandsareimmediateintegers.
*/ static Obj SumVectorInt(Obj vecL, Obj elmR)
{
Obj vecS; // handle of the sum
Obj * ptrS; // pointer into the sum
Obj elmS; // one element of sum list const Obj * ptrL; // pointer into the left operand
Obj elmL; // one element of left operand
UInt len; // length
UInt i; // loop variable
// make the result list
len = LEN_PLIST(vecL);
vecS = NEW_PLIST(TNUM_OBJ(vecL), len);
SET_LEN_PLIST(vecS, len);
// loop over the elements and add
ptrL = CONST_ADDR_OBJ(vecL);
ptrS = ADDR_OBJ(vecS); for (i = 1; i <= len; i++) {
elmL = ptrL[i]; if (! ARE_INTOBJS(elmL, elmR) || ! SUM_INTOBJS(elmS, elmL, elmR)) {
elmS = SUM(elmL, elmR);
ptrL = CONST_ADDR_OBJ(vecL);
ptrS = ADDR_OBJ(vecS);
ptrS[i] = elmS;
CHANGED_BAG(vecS);
} else
ptrS[i] = elmS;
}
return vecS;
}
/**************************************************************************** ** *FSumVectorVector(<vecL>,<vecR>)...........sumoftwovectors ** **'SumVectorVector'returnsthesumofthetwovectors<vecL>and<vecR>. **Thesumisanewlist,whereeachelementisthesumofthecorresponding **elementsof<vecL>and<vecR>. ** **'SumVectorVector'isanimprovedversionof'SumListList',whichdoesnot **call'SUM'iftheoperandsareimmediateintegers.
*/ static Obj SumVectorVector(Obj vecL, Obj vecR)
{
Obj vecS; // handle of the sum
Obj * ptrS; // pointer into the sum
Obj elmS; // one element of sum list const Obj * ptrL; // pointer into the left operand
Obj elmL; // one element of left operand const Obj * ptrR; // pointer into the right operand
Obj elmR; // one element of right operand
UInt lenL, lenR, len, lenmin; // lengths
UInt i; // loop variable
// make the result list
lenL = LEN_PLIST(vecL);
lenR = LEN_PLIST(vecR); if (lenL < lenR) {
lenmin = lenL;
len = lenR;
} else {
lenmin = lenR;
len = lenL;
}
vecS = NEW_PLIST_WITH_MUTABILITY(
IS_MUTABLE_OBJ(vecL) || IS_MUTABLE_OBJ(vecR), T_PLIST_CYC, len);
SET_LEN_PLIST(vecS, len);
// loop over the elements and add
ptrL = CONST_ADDR_OBJ(vecL);
ptrR = CONST_ADDR_OBJ(vecR);
ptrS = ADDR_OBJ(vecS); for (i = 1; i <= lenmin; i++) {
elmL = ptrL[i];
elmR = ptrR[i]; if (! ARE_INTOBJS(elmL, elmR) || ! SUM_INTOBJS(elmS, elmL, elmR)) {
elmS = SUM(elmL, elmR);
ptrL = CONST_ADDR_OBJ(vecL);
ptrR = CONST_ADDR_OBJ(vecR);
ptrS = ADDR_OBJ(vecS);
ptrS[i] = elmS;
CHANGED_BAG(vecS);
} else
ptrS[i] = elmS;
} if (lenL < lenR) for (; i <= lenR; i++) {
ptrS[i] = ptrR[i];
} else for (; i <= lenL; i++) {
ptrS[i] = ptrL[i];
}
return vecS;
}
/**************************************************************************** ** *FDiffIntVector(<elmL>,<vecR>)...differenceofanintegerandavector ** **'DiffIntVector'returnsthedifferenceoftheinteger<elmL>andthe **vector<vecR>.Thedifferenceisalist,whereeachelementisthe **differenceof<elmL>andthecorrespondingelementof<vecR>. ** **'DiffIntVector'isanimprovedversionof'DiffSclList',whichdoesnot **call'DIFF'iftheoperandsareimmediateintegers.
*/ static Obj DiffIntVector(Obj elmL, Obj vecR)
{
Obj vecD; // handle of the difference
Obj * ptrD; // pointer into the difference
Obj elmD; // one element of difference list const Obj * ptrR; // pointer into the right operand
Obj elmR; // one element of right operand
UInt len; // length
UInt i; // loop variable
// make the result list
len = LEN_PLIST(vecR);
vecD = NEW_PLIST_WITH_MUTABILITY(IS_MUTABLE_OBJ(vecR), T_PLIST_CYC, len);
SET_LEN_PLIST(vecD, len);
// loop over the elements and subtract
ptrR = CONST_ADDR_OBJ(vecR);
ptrD = ADDR_OBJ(vecD); for (i = 1; i <= len; i++) {
elmR = ptrR[i]; if (! ARE_INTOBJS(elmL, elmR) || ! DIFF_INTOBJS(elmD, elmL, elmR)) {
elmD = DIFF(elmL, elmR);
ptrR = CONST_ADDR_OBJ(vecR);
ptrD = ADDR_OBJ(vecD);
ptrD[i] = elmD;
CHANGED_BAG(vecD);
} else
ptrD[i] = elmD;
}
return vecD;
}
/**************************************************************************** ** *FDiffVectorInt(<vecL>,<elmR>)...differenceofavectorandaninteger ** **'DiffVectorInt'returnsthedifferenceofthevector<vecL>andthe **integer<elmR>.Thedifferenceisalist,whereeachelementisthe **differenceof<elmR>andthecorrespondingelementof<vecL>. ** **'DiffVectorInt'isanimprovedversionof'DiffListScl',whichdoesnot **call'DIFF'iftheoperandsareimmediateintegers.
*/ static Obj DiffVectorInt(Obj vecL, Obj elmR)
{
Obj vecD; // handle of the difference
Obj * ptrD; // pointer into the difference
Obj elmD; // one element of difference list const Obj * ptrL; // pointer into the left operand
Obj elmL; // one element of left operand
UInt len; // length
UInt i; // loop variable
// make the result list
len = LEN_PLIST(vecL);
vecD = NEW_PLIST(TNUM_OBJ(vecL), len);
SET_LEN_PLIST(vecD, len);
// loop over the elements and subtract
ptrL = CONST_ADDR_OBJ(vecL);
ptrD = ADDR_OBJ(vecD); for (i = 1; i <= len; i++) {
elmL = ptrL[i]; if (! ARE_INTOBJS(elmL, elmR) || ! DIFF_INTOBJS(elmD, elmL, elmR)) {
elmD = DIFF(elmL, elmR);
ptrL = CONST_ADDR_OBJ(vecL);
ptrD = ADDR_OBJ(vecD);
ptrD[i] = elmD;
CHANGED_BAG(vecD);
} else
ptrD[i] = elmD;
}
return vecD;
}
/**************************************************************************** ** *FDiffVectorVector(<vecL>,<vecR>)........differenceoftwovectors ** **'DiffVectorVector'returnsthedifferenceofthetwovectors<vecL>and **<vecR>.Thedifferenceisanewlist,whereeachelementisthe **differenceofthecorrespondingelementsof<vecL>and<vecR>. ** **'DiffVectorVector'isanimprovedversionof'DiffListList',whichdoes **notcall'DIFF'iftheoperandsareimmediateintegers.
*/ static Obj DiffVectorVector(Obj vecL, Obj vecR)
{
Obj vecD; // handle of the sum
Obj * ptrD; // pointer into the sum
Obj elmD; // one element of sum list const Obj * ptrL; // pointer into the left operand
Obj elmL; // one element of left operand const Obj * ptrR; // pointer into the right operand
Obj elmR; // one element of right operand
UInt lenL, lenR, len, lenmin; // lengths
UInt i; // loop variable
// make the result list
lenL = LEN_PLIST(vecL);
lenR = LEN_PLIST(vecR); if (lenL < lenR) {
lenmin = lenL;
len = lenR;
} else {
lenmin = lenR;
len = lenL;
}
vecD = NEW_PLIST_WITH_MUTABILITY(
IS_MUTABLE_OBJ(vecL) || IS_MUTABLE_OBJ(vecR), T_PLIST_CYC, len);
SET_LEN_PLIST(vecD, len);
// loop over the elements and subtract
ptrL = CONST_ADDR_OBJ(vecL);
ptrR = CONST_ADDR_OBJ(vecR);
ptrD = ADDR_OBJ(vecD); for (i = 1; i <= lenmin; i++) {
elmL = ptrL[i];
elmR = ptrR[i]; if (! ARE_INTOBJS(elmL, elmR) || ! DIFF_INTOBJS(elmD, elmL, elmR)) {
elmD = DIFF(elmL, elmR);
ptrL = CONST_ADDR_OBJ(vecL);
ptrR = CONST_ADDR_OBJ(vecR);
ptrD = ADDR_OBJ(vecD);
ptrD[i] = elmD;
CHANGED_BAG(vecD);
} else
ptrD[i] = elmD;
} if (lenL < lenR) for (; i <= lenR; i++) {
elmR = ptrR[i]; if (! IS_INTOBJ(elmR) || ! DIFF_INTOBJS(elmD, INTOBJ_INT(0), elmR)) {
elmD = AINV_SAMEMUT(elmR);
ptrR = CONST_ADDR_OBJ(vecR);
ptrD = ADDR_OBJ(vecD);
ptrD[i] = elmD;
CHANGED_BAG(vecD);
} else
ptrD[i] = elmD;
} else for (; i <= lenL; i++) {
ptrD[i] = ptrL[i];
}
return vecD;
}
/**************************************************************************** ** *FProdIntVector(<elmL>,<vecR>)....productofanintegerandavector ** **'ProdIntVector'returnstheproductoftheinteger<elmL>andthevector **<vecR>.Theproductisthelist,whereeachelementistheproductof **<elmL>andthecorrespondingentryof<vecR>. ** **'ProdIntVector'isanimprovedversionof'ProdSclList',whichdoesnot **call'PROD'iftheoperandsareimmediateintegers.
*/ static Obj ProdIntVector(Obj elmL, Obj vecR)
{
Obj vecP; // handle of the product
Obj * ptrP; // pointer into the product
Obj elmP; // one element of product list const Obj * ptrR; // pointer into the right operand
Obj elmR; // one element of right operand
UInt len; // length
UInt i; // loop variable
// make the result list
len = LEN_PLIST(vecR);
vecP = NEW_PLIST_WITH_MUTABILITY(IS_MUTABLE_OBJ(vecR), T_PLIST_CYC, len);
SET_LEN_PLIST(vecP, len);
// loop over the entries and multiply
ptrR = CONST_ADDR_OBJ(vecR);
ptrP = ADDR_OBJ(vecP); for (i = 1; i <= len; i++) {
elmR = ptrR[i]; if (! ARE_INTOBJS(elmL, elmR) || ! PROD_INTOBJS(elmP, elmL, elmR)) {
elmP = PROD(elmL, elmR);
ptrR = CONST_ADDR_OBJ(vecR);
ptrP = ADDR_OBJ(vecP);
ptrP[i] = elmP;
CHANGED_BAG(vecP);
} else
ptrP[i] = elmP;
}
¤ Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.0.46Bemerkung:
¤
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.