Цитаты кода и деревья выражений

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

Спасибо.


person ay.metallo    schedule 15.11.2011    source источник


Ответы (1)


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

  • Котировки разработаны более функциональным образом. Например, 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#. Насколько я знаю, обратного перевода нет.

person Tomas Petricek    schedule 15.11.2011