Esempio n. 1
0
        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);
        }
Esempio n. 2
0
        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);
        }