Ejemplo n.º 1
0
        public ILanguageExpressionBasic Generate_TransformApplication(GMacMultivectorTransform transform, ILanguageExpression expr)
        {
            SetOperands(expr);

            VerifyOperation_TransformApplication(transform);

            return(BasicUnary.Create(_resultType, transform, _atomicOperand1));
        }
Ejemplo n.º 2
0
        private ILanguageExpression CompileBasicUnary(BasicUnary expr)
        {
            var compiledOperator = expr.Operator.DuplicateOperator();

            var compiledOperand = (ILanguageExpressionAtomic)CompileExpression(expr.Operand);

            return(BasicUnary.Create(expr.ExpressionType, compiledOperator, compiledOperand));
        }
Ejemplo n.º 3
0
        private static ILanguageExpressionAtomic AtomicExpressionToMultivectorAtomicExpression(this CommandBlock commandBlock, GMacFrameMultivector mvType, ILanguageExpressionAtomic oldExpr)
        {
            if (oldExpr.ExpressionType.IsSameType(mvType))
            {
                return(oldExpr);
            }

            if (!oldExpr.ExpressionType.IsNumber())
            {
                throw new InvalidCastException("Cannot convert atomic expression of type " + oldExpr.ExpressionType.TypeSignature + " to a expression of type " + mvType.TypeSignature);
            }

            var valuePrimitive = oldExpr as ValuePrimitive <int>;

            if (valuePrimitive != null)
            {
                return(GMacValueMultivector.CreateScalar(
                           mvType,
                           MathematicaScalar.Create(SymbolicUtils.Cas, valuePrimitive.Value)
                           ));
            }

            var primitive = oldExpr as ValuePrimitive <MathematicaScalar>;

            if (primitive != null)
            {
                return(GMacValueMultivector.CreateScalar(
                           mvType,
                           primitive.Value
                           ));
            }

            //This should be a value access of type integer or scalar
            if (!(oldExpr is LanguageValueAccess))
            {
                throw new InvalidCastException(
                          "Cannot convert atomic expression " + oldExpr + " of type " +
                          oldExpr.ExpressionType.TypeSignature + " to a atomic expression of type" +
                          mvType.TypeSignature
                          );
            }

            //Create a cast operation
            var newRhsExpr = BasicUnary.Create(mvType, mvType, oldExpr);

            //The new expresssion is not atomic. Create a local variable to hold value and return the local variable
            //as a direct value access object
            return(NonAtomicExpressionToValueAccess(commandBlock, newRhsExpr));
        }
Ejemplo n.º 4
0
        private static ILanguageExpressionAtomic AtomicExpressionToScalarAtomicExpression(this CommandBlock commandBlock, ILanguageExpressionAtomic oldExpr)
        {
            var scalarType = ((GMacAst)commandBlock.RootAst).ScalarType;

            if (oldExpr.ExpressionType.IsSameType(scalarType))
            {
                return(oldExpr);
            }

            if (!oldExpr.ExpressionType.IsInteger())
            {
                throw new InvalidCastException("Cannot convert atomic expression of type " + oldExpr.ExpressionType.TypeSignature + " to a scalar atomic expression");
            }

            var valuePrimitive = oldExpr as ValuePrimitive <int>;

            if (valuePrimitive != null)
            {
                return(ValuePrimitive <MathematicaScalar> .Create(
                           scalarType,
                           MathematicaScalar.Create(SymbolicUtils.Cas, valuePrimitive.Value)
                           ));
            }

            //This should be a value access of type integer
            if (!(oldExpr is LanguageValueAccess))
            {
                throw new InvalidCastException("Cannot convert atomic expression " + oldExpr + " of type " +
                                               oldExpr.ExpressionType.TypeSignature + " to a scalar atomic expression");
            }

            //Create a cast operation
            var newRhsExpr = BasicUnary.Create(scalarType, scalarType, oldExpr);

            //The new expresssion is not atomic. Create a local variable to hold value and return the local variable
            //as a direct value access object
            return(NonAtomicExpressionToValueAccess(commandBlock, newRhsExpr));
        }
Ejemplo n.º 5
0
 internal BasicUnary CreateTransformExpression(ILanguageExpressionAtomic operand)
 {
     return(BasicUnary.Create(TargetFrame.MultivectorType, this, operand));
 }