Вычисление цитируемого выражения в F #

Надеюсь, я не пропустил ничего очевидного, но я играл с выражениями F #, и я хочу оценивать цитируемые выражения на лету. Например, я хочу написать что-то вроде этого:

let x = <@ 2 * 5 @>
let y = transform x // replaces op_Multiply with op_Addition, or <@ 2 + 5 @>
let z = eval y // dynamically evaluates y, returns 7

Есть ли встроенный метод F #, который может оценивать цитируемые выражения, или мне нужно написать свои собственные?

Ответ 1

Нет, нет встроенного способа компиляции цитат F #. С помощью PowerPack LINQ вы можете конвертировать НЕКОТОРЫЕ котировки в .NET System.Linq.Expressions.Expression и использовать их для их компиляции.

Были сделаны котировки, чтобы разрешить другие интерпретации кода, такие как таргетинг на SQL или графическую карту.

Однако в сообщениях на hubfs было намечено, что это общий запрос и будет рассмотрен.

Ответ 2

Я реализовал оценщик котировок на основе отражения как часть Unquote (это новая функция с версии 2.0.0).

> #r @"..\packages\Unquote.2.2.2\lib\net40\Unquote.dll"

--> Referenced '..\packages\Unquote.2.2.2\lib\net40\Unquote.dll'

> Swensen.Unquote.Operators.eval <@ sprintf "%A" (1,2) @>;;
val it : string = "(1, 2)"

Я измерил его до 50 раз быстрее, чем оценщик PowerPack. Это, конечно, будет меняться по сценарию. Но Unquote, как правило, больше, чем PowerPack, при интерпретации выражений.

Он также поддерживает гораздо больше выражений, чем оценщик PowerPack, включая VarSet, PropertySet, FieldSet, WhileLoop, ForIntegerRangeLoop и Quote. Фактически, оценщик Unquote поддерживает все выражения котировок, за исключением NewDelegate, AddressSet и AddressOf, все из которых я планирую в конечном итоге поддерживать.

Ответ 3

Вы можете оценить цитату F #, используя член расширения Eval, предоставленный библиотекой FSharp.PowerPack.Linq, как показано ниже:

#r "FSharp.PowerPack.Linq.dll"

open Linq.QuotationEvaluation
let f = <@2 + [email protected]>
f.Eval()

Обратите внимание, что вы должны open пространство имен Linq.QuotationEvaluation сделать этот член расширения доступным.

Существует также элемент расширения Compile, который возвращает приостановку, но не улучшает производительность.

Ответ 4

Обновлено в 2016 году

Теперь метод расширения Evaluate можно найти в пакете NuGet FSharp.Quotations.Evaluator

#r "../packages/FSharp.Quotations.Evaluator.1.0.7/lib/net40/FSharp.Quotations.Evaluator.dll"

open FSharp.Quotations.Evaluator

let f = <@ 2 + 3 @>
f.Evaluate()

Ответ 5

Я думаю, что цитаты получили .eval() -метод.