Кодовые цитаты и деревья выражений - PullRequest
14 голосов
/ 15 ноября 2011

Интересно, есть ли разница в том, как эти две функции реализованы под капотом? То есть Разве это не просто цитаты кода, построенные поверх старых добрых деревьев выражений?

Спасибо.

1 Ответ

21 голосов
/ 15 ноября 2011

Два типа довольно похожи, но они представлены по-разному.

  • Котировки оформлены более функционально. Например, foo a b будет представлен в виде серии приложений App(App(foo, a), b)

  • Цитаты могут представлять некоторые конструкции, доступные только в F #, и использование деревьев выражений скрыло бы их. Например, есть Expr.LetRecursive для let rec объявлений

  • Цитаты были впервые введены в .NET 3.0. Тогда деревья выражений могли представлять только выражения C #, поэтому было невозможно легко захватить все конструкции F # (цитаты могут захватить любое выражение F #, включая императивные).

  • Котировки также могут быть легко обработаны с использованием рекурсии. Модуль ExprShape содержит шаблоны, которые позволяют обрабатывать все возможные цитаты всего за 4 случая (что намного проще, чем реализация шаблона посетителя с десятками методов в C #).

Если у вас есть цитата F #, вы можете перевести ее в дерево выражений C #, используя FSharp.Quotations.Evaluator . Это очень полезно, если вы используете .NET API, который ожидает деревья выражений от F #. Насколько я знаю, обратного перевода нет.

...