F # эквивалент Eval - PullRequest
       21

F # эквивалент Eval

12 голосов
/ 09 апреля 2010

Есть ли F # эквивалент eval? Мое намерение состоит в том, чтобы мое приложение загрузило небольшой пример кода из файла и, по сути,

let file = "c:\mysample"
let sample = loadFromFile file
let results = eval(sample)

Я новичок в F # и пытаюсь выяснить некоторые ограничения, прежде чем применить его к проекту.

Спасибо

1 Ответ

13 голосов
/ 09 апреля 2010

Нет функции, которая позволила бы вам сделать это напрямую. Однако, если вы хотите скомпилировать исходный файл F # программно, вы можете вызвать компилятор F # из своего приложения. Самый простой способ сделать это - использовать провайдера F # CodeDOM, который доступен как часть F # PowerPack (в сборке FSharp.Compiler.CodeDom.dll). Однако учтите, что на компьютере пользователя должен быть установлен компилятор F #.

Код для запуска компилятора будет выглядеть примерно так:

open Microsoft.FSharp.Compiler.CodeDom

let provider = new FSharpCodeProvider()
let compiler = provider.CreateCompiler()

let parameters = new CompilerParameters
  (GenerateExecutable = true, OutputAssembly = "file.exe")
let results = icc.CompileAssemblyFromFile(parameters, "filename.fs")

Как только вы скомпилируете исходный файл в сборку, вам нужно будет загрузить сборку с помощью .NET Reflection и запустить какую-то определенную функцию или класс из сборки (вы можете, например, найти функцию с некоторым специальным именем или помеченной с некоторым атрибутом).

(Как примечание, использование цитат или написание собственного интерпретатора, как указано в связанном вопросе SO может быть вариантом, если ваш исходный код относительно прост, но, вероятно, нет, если вы хочу поддерживать всю мощь F #)

...