/// <summary> /// Evaluate a multivector construction operation /// </summary> /// <param name="mvTypeCons"></param> /// <param name="operands"></param> /// <returns></returns> private GMacValueMultivector EvaluateBasicPolyadicMultivectorConstructor(GMacFrameMultivectorConstructor mvTypeCons, OperandsByIndex operands) { GMacValueMultivector value; if (mvTypeCons.HasDefaultValueSource) { value = (GMacValueMultivector)mvTypeCons .DefaultValueSource .AcceptVisitor(this) .DuplicateValue(true); } else { value = (GMacValueMultivector)GMacRootAst .CreateDefaultValue(mvTypeCons.MultivectorType); } foreach (var pair in operands.OperandsDictionary) { var rhsValue = (ValuePrimitive <MathematicaScalar>)pair.Value.AcceptVisitor(this); //TODO: Is it necessary to make a copy of the RHS value in all cases? value[pair.Key] = (ValuePrimitive <MathematicaScalar>)rhsValue.DuplicateValue(true); } return(value); }
private ILanguageExpression CompileMultivectorConstructor(GMacFrameMultivectorConstructor mvTypeCons, OperandsByIndex operands) { ILanguageExpressionAtomic compiledDefaultValueSource = null; if (mvTypeCons.HasDefaultValueSource) { compiledDefaultValueSource = (ILanguageExpressionAtomic)CompileExpression(mvTypeCons.DefaultValueSource); } var compiledOperands = OperandsByIndex.Create(); foreach (var pair in operands.OperandsDictionary) { var compiledRhsExpr = (ILanguageExpressionAtomic)CompileExpression(pair.Value); compiledOperands.AddOperand(pair.Key, compiledRhsExpr); } return(mvTypeCons.MultivectorType.CreateConstructorExpression(compiledDefaultValueSource, compiledOperands)); }
internal void Generate_BasicPolyadic_FrameMultivectorConstruction(GMacFrameMultivectorConstructor mvTypeCons, OperandsByIndex operands) { //this.Log.Append(mv_type_cons.OperatorName); Log.Append("{"); if (mvTypeCons.HasDefaultValueSource) { mvTypeCons.DefaultValueSource.AcceptVisitor(this); } Log.Append("}"); Log.Append("("); var flag = false; foreach (var pair in operands.OperandsDictionary) { if (flag) { Log.Append(", "); } else { flag = true; } Log.Append("#"); Log.Append(mvTypeCons.MultivectorType.ParentFrame.BasisBladeName(pair.Key)); Log.Append("#"); Log.Append(" = "); pair.Value.AcceptVisitor(this); } Log.Append(")"); }