Citas de código y árboles de expresión.

expression-trees f# quotations

Pregunta

Me pregunto si hay alguna diferencia en cómo se implementan las dos características bajo el capó. Es decir, ¿no solo las citas de código se construyeron sobre los viejos árboles de buena expresión?

Gracias.

Respuesta aceptada

Los dos tipos son bastante similares, pero están representados de manera diferente.

  • Las citas están diseñadas de una manera más funcional. Por ejemplo, foo ab se representaría como una serie de aplicaciones App(App(foo, a), b)

  • Las citas pueden representar algunas construcciones que están disponibles solo en F # y el uso de árboles de expresión las escondería. Por ejemplo, hay Expr.LetRecursive para let rec declaraciones

  • Las citas se introdujeron por primera vez en .NET 3.0. En ese entonces, los árboles de expresión solo podían representar expresiones de C #, por lo que no era posible capturar fácilmente todas las construcciones de F # (las citas pueden capturar cualquier expresión de F #, incluidas las imperativas).

  • Las citas también están diseñadas para ser fácilmente procesables utilizando la recursión. El módulo ExprShape contiene patrones que le permiten manejar todas las citas posibles con solo 4 casos (lo cual es mucho más fácil que implementar un patrón de visitante con decenas de métodos en C #).

Cuando tiene una cita de F #, puede traducirla al árbol de expresiones de C # usando FSharp.Quotations.Evaluator . Esto es bastante útil si está utilizando alguna API .NET que espera que los árboles de expresión de F #. Que yo sepa, no hay traducción al revés.



Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow