2011-11-15 23 views
13

Zastanawiam się, czy jest jakaś różnica w sposobie implementacji tych dwóch funkcji pod maską? To znaczy. Czy nie są to tylko cytaty kodu zbudowane na starych drzewach dobrej ekspresji?Cytaty kodowe i drzewa ekspresji

Dzięki.

Odpowiedz

20

Te dwa typy są dość podobne, ale są reprezentowane inaczej.

  • Cytaty są zaprojektowane w bardziej funkcjonalny sposób. Na przykład foo a b będzie reprezentowany jako szereg aplikacji. App(App(foo, a), b)

  • Cytaty mogą reprezentować pewne konstrukcje, które są dostępne tylko w języku F # i używają drzewek wyrażeń, które je ukrywały. Na przykład Expr.LetRecursive dla let rec deklaracji

  • Cytaty zostały po raz pierwszy wprowadzone w .NET 3.0. W tamtych czasach drzewa wyrażeń mogły reprezentować tylko wyrażenia C#, więc nie było możliwe łatwe przechwycenie wszystkich konstrukcji F # (cytaty mogą przechwytywać dowolne wyrażenie F #, w tym wyrażenia imperatywne).

  • Cytaty są również zaprojektowane tak, aby były łatwo przetwarzalne przy użyciu rekursji. Moduł ExprShape zawiera wzorce, które umożliwiają obsłużenie wszystkich możliwych cytatów za pomocą zaledwie 4 przypadków (co jest dużo łatwiejsze niż implementacja wzorca użytkownika z dziesiątkami metod w języku C#).

Kiedy masz cytat F #, można przełożyć go do drzewa wyrażenie C# za pomocą FSharp.Quotations.Evaluator. Jest to przydatne, jeśli używasz API .NET, który oczekuje drzewek wyrażeń z F #. O ile mi wiadomo, nie ma tłumaczenia na odwrót.