Dynamic Language Runtime (Parte 3) Expresiones Binarias

Published on Author lopezLeave a comment

Próximo post
Anterior post

Implementé algunos ejemplos simples usando DLR. Mostré cómo crear y evaluar expresiones. Cada Expression tiene algunas propiedades y métodos expuestos. Algunas de las más importantes:

Noten que cada objeto Expression tiene un NodeType, y Type separado. Exploremos esos valores:

BinaryExpression expr = Expression.Add(Expression.Constant(10),
    Expression.Constant(20));
Console.WriteLine(expr.GetType().FullName);
Console.WriteLine(expr.Type);
Console.WriteLine(expr.Left.Type);
Console.WriteLine(expr.Right.Type);
Console.WriteLine(expr.NodeType);
Console.WriteLine(expr.Left.NodeType);
Console.WriteLine(expr.Right.NodeType);

Veamos Expression.Add. Es una expresión binaria. Cada una de esas expresiones tiene dos ramas:

Obtengo la salida:

Noten que el .GetType() (el tipo .NET) de la Expression creada, es SimpleBinaryExpression: no es sólo un objeto Expression. Tampoco hay un AddExpression como clase en DLR. El expr.NodeType indica que la expresión creada es un Add. Los creadores de DLR decidieron no tener una clase dedicada para los Expression.Add.

Un BinaryExpression tiene Type: System.Int32, un entero de 32 bits. Este es el tipo que indica qué clase de valor retornará esta expresión. Se deriva de la acción de la expresión binaria (sumar) y los tipos de sus ramas izquierda y derecha.

En C#, podemos combinar expresiones binarias:

// double result = (3d + 2d) / 7d;
// Console.WriteLine(result);
BinaryExpression expr2 = Expression.Divide(
    Expression.Add(Expression.Constant(3d),
        Expression.Constant(2d)),
    Expression.Constant(7d)
    );
Func<double> binaryDelegate = Expression.Lambda<Func<double>>(expr2).Compile();
Console.WriteLine(binaryDelegate.Invoke());

Principal fuente consultada para este ejemplo: “Pro DLR in .NET 4” de Chaur Wu. El código de esta serie de post se mantiene en  http://code.google.com/p/ajcodekatas/ en el directorio trunk/Dlr.

Próximos pasos: expresiones IfThenElse, expresiones switch, qué es un visitor, y qué es Reduce.

Nos leemos!

Angel “Java” Lopez

http://www.ajlopez.com

http://twitter.com/ajlopez

Leave a Reply

Your email address will not be published. Required fields are marked *