示例#1
0
        public static CLBinaryOperator LoadBinaryTimes(int priority = TimesPriority, bool valOnLeft = true, bool valOnRight = true)
        {
            BinaryTimes = CLOperators.BinaryOperators.GetOrNull("*") ?? new CLBinaryOperator("*", priority, valOnLeft, valOnRight);
            BinaryTimes.AddFunction(tNum, tNum, BinTimesNumbers);
            BinaryTimes.AddFunction(tNum, tLst, (left, right, vars, context) => BinTimesList(right, left, vars, context));
            BinaryTimes.AddFunction(tNum, tStr, (left, right, vars, context) => BinTimesString(right, left, vars, context));
            BinaryTimes.AddFunction(tLst, tLst, (left, right, vars, context) => BinTimesList(left, ListToNum(right), vars, context));
            BinaryTimes.AddFunction(tLst, tNum, BinTimesList);
            BinaryTimes.AddFunction(tStr, tNum, BinTimesString);

            return(BinaryTimes);
        }
示例#2
0
        // Multiplies a list by a number.
        public static CalcValue BinTimesList(CalcObject left, CalcObject right, CLLocalStore vars, CLContextProvider context)
        {
            CalcList   lstLeft  = left as CalcList;
            CalcNumber numRight = right as CalcNumber;

            // If it has a string, we'll just repeat the list multiple times.
            if (lstLeft.HasString())
            {
                int count = (int)numRight;
                if (count < 0)
                {
                    throw new CLException("Lists cannot be repeated negative times.");
                }

                CalcValue[] lstRet = new CalcValue[lstLeft.Count * count];

                for (int i = 0; i < count; i++)
                {
                    for (int j = 0; j < lstLeft.Count; j++)
                    {
                        lstRet[i * lstLeft.Count + j] = lstLeft[j];
                    }
                }

                return(new CalcList(lstRet));
            }
            else
            {
                // Otherwise we'll multiply everything by the number.
                CalcValue[] lstRet = new CalcValue[lstLeft.Count];

                for (int i = 0; i < lstRet.Length; i++)
                {
                    lstRet[i] = BinaryTimes.Run(lstLeft[i], numRight, vars, context);
                }
                return(new CalcList(lstRet));
            }
        }