Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Code quotations and Expression trees

I wonder if there is any difference in how the two features are implemented under the hood? I.e. Aren't just code quotations built on top of the old good expression trees?

Thanks.

like image 747
ay.metallo Avatar asked Nov 15 '11 09:11

ay.metallo


1 Answers

The two types are quite similar, but they are represented differently.

  • Quotations are designed in a more functional way. For example foo a b would be represented as a series of applications App(App(foo, a), b)

  • Quotations can represent some constructs that are available only in F# and using expression trees would hide them. For example there is Expr.LetRecursive for let rec declarations

  • Quotations were first introduced in .NET 3.0. Back then expression trees could only represent C# expressions, so it wasn't possible to easily capture all F# constructs (quotations can capture any F# expression including imperative ones).

  • Quotations are also designed to be easily processible using recursion. The ExprShape module contains patterns that allow you to handle all possible quotations with just 4 cases (which is a lot easier than implementing visitor pattern with tens of methods in C#).

When you have an F# quotation, you can translate it to C# expression tree using FSharp.Quotations.Evaluator. This is quite useful if you're using some .NET API that expects expression trees from F#. As far as I know, there is no translation the other way round.

like image 123
Tomas Petricek Avatar answered Sep 20 '22 17:09

Tomas Petricek