Respuesta

2

Los árboles de expresión LINQ pueden representar cualquier cosa que pueda poner en una expresión C# normal. Como tal, no se pueden usar para representar directamente los bucles while, for bucles, etc.

Sin embargo, teóricamente es posible utilizar expresiones lambda y recursión para llevar a cabo cualquier iteración que pueda necesitar. En la práctica, puede ser más fácil eliminar los métodos Enumerable en su árbol.

+0

Los árboles de expresión LINQ no son compatibles con la recursividad, por lo que su única opción parece ser recurrir al boxeo y un combinador y, que será muy lento (una asignación por llamada a función). –

4

Sin definir lo que ejecutará el árbol, no lo sabemos. En la propia interpretación del CLR (cuando los compila en delegados) lo son. Pero si los traduce a SQL, no lo son, y puede inventar su propia interpretación confusa de ellos con las propiedades que desee.

Hasta que haya decidido cómo interpretarlos, solo son estructuras de datos.

1

Bueno, ¿por qué no intentas probarlo? Apuesto a que es un desafío divertido;)

Pero los árboles de expresión solo representan una expresión y, por lo tanto, tendrás que definir lo que puedes hacer, como afirma Earwicker.

Si permite que los árboles de expresión usen la recursión puede lograr la repetición, es decir, para bucles y demás.

Sin embargo, el cálculo lambda sin tipo es Turing-completo Complejidad-Turing # Ejemplos pero el cálculo Lambda no permite la recursión per se Lambda_calculus # Recursion todo es muy incierto.

Concluiré que la expresión probablemente sea Turing completa pero requerirá que alguien que esté más familiarizado con esto lo confirme.

+1

No tiene que "permitir" que los árboles usen recursión; ya pueden ser: http://blogs.msdn.com/madst/archive/2007/05/11/recursive-lambda-expressions.aspx –

21

En el primer borrador de la especificación C# 3.0 había un comentario en el margen de la sección sobre los árboles de expresión que dijo:

tengo una demostración verdaderamente maravillosa de Turing-completo pero este margen es demasiado estrecho para contener.

Lamentablemente, nadie ha sido capaz de averiguar quién lo escribió o desarrollar la prueba.

+0

Hahaha. Me pregunto si alguien más lo obtendrá. – TraumaPony

+0

lol - muy bueno. –

+0

Cerca de spit-take ... bueno. :) –

Cuestiones relacionadas