sábado, 8 de mayo de 2010

Manejo de árboles en C#


Los árboles de expresiones representan el código de una estructura de datos en forma de árbol, donde cada nodo es una expresión, por ejemplo, una llamada a un método o una operación binaria como x.

En la ilustración siguiente se muestra un ejemplo de una expresión y su representación en forma de un árbol de expresión. Las diferentes partes de la expresión tienen un color distinto para hacerlas coincidir con el nodo correspondiente del árbol de expresión. También se muestran los diferentes tipos de los nodos del árbol de expresión.
Se puede hacer que el compilador de C # o Visual Basic cree un árbol de expresión, se basa en una expresión lambda anónima, o se puede crear árboles de expresión manualmente utilizando el System.Linq.Expressions espacio de nombres.
En c# se pueden implementar una expresión lambda que es una función anónima que puede contener expresiones e instrucciones y se puede utilizar para crear delegados o tipos de árboles de expresión.

Todas las expresiones lambda utilizan el operador lambda = >, que se lee como "va a". El lado izquierdo del operador lambda especifica los parámetros de entrada (si existe alguno), mientras que el lado derecho contiene el bloque de expresiones o instrucciones. La expresión lambda x => x * x se lee "x va a x veces x". Esta expresión se puede asignar a un tipo de delegado del siguiente modo:
Las expresiones lambda de C# 3.0 ofrecen una posibilidad adicional, no disponible para los métodos anónimos, y que juega un papel importante en la implementación de la tecnología LINQ (Language Integrated Query – Consultas Integradas en el Lenguaje), que también será incorporada a la próxima versión de C# y VB y que constituye, según la modesta opinión de este autor, uno de los avances más significativos de los últimos tiempos en el área de los lenguajes y sistemas de programación.

C# da la posibilidad de que las expresiones lambda puedan compilarse como árboles de expresiones, objetos de datos que representan en memoria al algoritmo de evaluación de una expresión. Estos árboles en memoria pueden ser luego fácilmente manipulados mediante software, almacenados, transmitidos, etc.

Como Generar árboles de expresiones

El espacio de nombres System.Linq.Expressions en c# proporciona una API para la compilación manual de árboles de expresiones. La clase Expression contiene métodos de generador estáticos que crean nodos del árbol de expresión de tipos específicos, por ejemplo, un objeto ParameterExpression, que representa una expresión de parámetro con nombre, o un objeto, MethodCallExpression, que representa una llamada a un método. ParameterExpression, MethodCallExpression y los demás tipos de árboles de expresiones específicos de la expresión se definen también en el espacio de nombres System.Linq.Expressions. Estos tipos se derivan del tipo abstracto Expression.
El compilador también puede generar un árbol de expresión. Un árbol de expresión generado por el compilador siempre tiene como raíz un nodo de tipo
Expression(Of TDelegate); es decir, su nodo raíz representa una expresión lambda.
Los árboles de expresión deben ser inmutables. Esto significa que si desea modificar un árbol de expresión, debe construir un árbol de expresión nueva copiando la ya existente y la sustitución de los nodos en el mismo. Puede utilizar un visitante de árbol de expresión para recorrer el árbol de expresión existente.

Este tema me resulta un poco complejo pero lo que entiendo es que estos árboles permiten cambiar en tiempo de ejecución la expresión a ejecutar; es decir, estos árboles son estructuras que contienen expresiones que se utilizan para procesar los datos y algo que me llama mucho la atención es la inmutabilidad de estas estructuras ya que se tiene que copiar de nuevo para poder modificarlo.
http://msdn.microsoft.com/en-us/library/bb397951.aspx
http://msdn.microsoft.com/es-es/library/bb882536(v=VS.90).aspx

1 comentario: