Оценить цитируемое выражение в F # - PullRequest
12 голосов
/ 11 мая 2009

Я надеюсь, что не пропустил что-то очевидное, но я играл с выражениями 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 #, который может оценивать выражения в кавычках, или я должен написать свое собственное?

Ответы [ 5 ]

16 голосов
/ 09 июля 2011

Я реализовал анализ цитат на основе отражения как часть 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, которые я планирую в конечном итоге поддерживать.

9 голосов
/ 11 мая 2009

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

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

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

8 голосов
/ 09 июля 2011

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

#r "FSharp.PowerPack.Linq.dll"

open Linq.QuotationEvaluation
let f = <@2 + 3@>
f.Eval()

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

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

6 голосов
/ 16 июня 2016

Обновлено в 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()
0 голосов
/ 11 мая 2009

Я думаю, что котировки имеют .eval() -метод.

...