Подтвердить что ты не робот

Кодовые цитаты и деревья выражений

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

Спасибо.

4b9b3361

Ответ 1

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

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

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

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

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

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