Citations de code et arbres d'expression

expression-trees f# quotations

Question

Je me demande s'il y a une différence dans la manière dont les deux fonctionnalités sont mises en œuvre sous le capot? C'est-à-dire que les citations de code ne sont pas simplement construites au-dessus des vieux bons arbres d'expression?

Merci.

Réponse acceptée

Les deux types sont assez similaires, mais ils sont représentés différemment.

  • Les devis sont conçus de manière plus fonctionnelle. Par exemple, foo ab serait représenté comme une série d'applications App(App(foo, a), b)

  • Les citations peuvent représenter certaines constructions disponibles uniquement en F # et l'utilisation d'arborescences d'expression les masquerait. Par exemple, il existe Expr.LetRecursive pour let rec déclarations let rec Expr.LetRecursive

  • Les citations ont été introduites pour la première fois dans .NET 3.0. À l'époque, les arbres d'expression ne pouvaient représenter que des expressions C #, il était donc impossible de capturer facilement toutes les constructions F # (les citations peuvent capturer toute expression F #, y compris les expressions impératives).

  • Les citations sont également conçues pour être facilement traitables à l'aide de la récursivité. Le module ExprShape contient des modèles qui vous permettent de gérer toutes les citations possibles avec seulement 4 cas (ce qui est beaucoup plus simple que d'implémenter un modèle de visiteur avec des dizaines de méthodes en C #).

Lorsque vous avez une citation F #, vous pouvez la traduire en arborescence d'expression C # à l'aide de FSharp.Quotations.Evaluator . Ceci est très utile si vous utilisez une API .NET qui attend des arbres d’expression de F #. Autant que je sache, il n'y a pas de traduction dans l'autre sens.



Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow