public override DLR.Expression Generate(AplusScope scope) { DLR.Expression result; if (scope.IsAssignment && TokenUtils.AllowedPrimitiveFunction(this.token.Type)) { /* * input: x -> right side, value * Perform the function like this: * * i := f{iota rho x} * (,x)[i] := value * * where 'f' is the monadic function */ DLR.Expression target = Node.TestMonadicToken(this.expression, Tokens.RAVEL) ? ((MonadicFunction)this.expression).Expression.Generate(scope) : this.expression.Generate(scope) ; // i:=(iota rho x) DLR.Expression indices = AST.Assign.BuildIndicesList(scope, target); // (,x)[f{i}] result = AST.Assign.BuildIndexing(scope, target, GenerateMonadic(scope, indices)); } else { result = GenerateMonadic(scope, this.expression.Generate(scope)); } return(result); }
public override DLR.Expression Generate(AplusScope scope) { DLR.Expression result; if (scope.IsAssignment && TokenUtils.AllowedPrimitiveFunction(this.token.Type)) { /* * input: y -> left side, x -> right side, value * Perform the function like this: * * i := f{y; iota rho x} * (,x)[i] := value * * where 'f' is the dyadic function */ DLR.Expression left = this.leftExpression.Generate(scope); DLR.Expression right = Node.TestMonadicToken(this.rightExpression, Tokens.RAVEL) ? ((MonadicFunction)this.rightExpression).Expression.Generate(scope) : this.rightExpression.Generate(scope) ; // i:=(iota rho x) DLR.Expression indices = AST.Assign.BuildIndicesList(scope, right); // (,x)[f{a;i}] result = AST.Assign.BuildIndexing(scope, right, GenerateDyadic(scope, indices, left)); } else if (scope.IsAssignment && this.token.Type == Tokens.CHOOSE) { scope.IsAssignment = false; DLR.Expression left = this.leftExpression.Generate(scope); scope.IsAssignment = true; DLR.Expression right = this.rightExpression.Generate(scope); result = DLR.Expression.Block( DLR.Expression.Assign(scope.CallbackInfo.Index, left), DLR.Expression.Call( DLR.Expression.Constant(DyadicFunctionInstance.Choose), DyadicFunctionInstance.Choose.GetType().GetMethod("Assign"), right, left, scope.GetRuntimeExpression() ) ); } else if (scope.IsAssignment && this.token.Type == Tokens.PICK) { scope.IsAssignment = false; DLR.Expression left = this.leftExpression.Generate(scope); scope.IsAssignment = true; DLR.Expression right = this.rightExpression.Generate(scope); result = DLR.Expression.Block( DLR.Expression.Assign(scope.CallbackInfo.Path, left), DLR.Expression.Call( DLR.Expression.Constant(DyadicFunctionInstance.Pick), DyadicFunctionInstance.Pick.GetType().GetMethod("Execute"), right, left, scope.GetRuntimeExpression() ) ); } else { DLR.Expression left = this.leftExpression.Generate(scope); DLR.Expression right = this.rightExpression.Generate(scope); result = GenerateDyadic(scope, right, left); } return(result); }