Интересно, есть ли разница в том, как эти две функции реализованы под капотом? т.е. Разве цитаты кода не построены поверх старых добрых деревьев выражений?
Спасибо.
Интересно, есть ли разница в том, как эти две функции реализованы под капотом? т.е. Разве цитаты кода не построены поверх старых добрых деревьев выражений?
Спасибо.
Эти два типа очень похожи, но представлены по-разному.
Котировки разработаны более функциональным образом. Например, 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#. Насколько я знаю, обратного перевода нет.