2010-04-09 5 views
12

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

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

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

Спасибо

+0

Возможный дубликат: http://stackoverflow.com/questions/372043/how-can-evaluate-an-expression-stored-as-a-string-in-f – Brian

+0

Вы хотите загрузить код F # из этого файл? – phimuemue

+0

Я думаю, что этот пост задает немного другой вопрос (хотя и с технической точки зрения). Описанный Брайаном вопрос о простых выражениях, в то время как этот вопрос требует компиляции/оценки файла. Технически это может быть одно и то же, но, вероятно, это совсем другой вариант использования. –

ответ

13

Там нет функции, которая позволит вам сделать это непосредственно. Однако, если вы хотите скомпилировать исходный файл 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 и запустить некоторые конкретные функции или класс из сборки (вы можете, например, искать функцию с каким-то специальным именем или отмечать некоторым атрибутом).

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

+0

Я все еще пытаюсь склонить голову к цитатам и метапрограммированию вообще. Я почти уверен, что это функциональность, в которой я не нуждаюсь, но думал о возможности предоставить некоторые тестовые примеры через наборы данных в отдельных файлах, которые я мог бы загружать динамически. CodeDom (ugh - помните, что вырвать у этой свиньи в 2004 году в C#) будет бесцельно делать трюк. Благодарю за ваш ответ. – akaphenom

+2

** CodeDOM ** не очень изящная технология, но она должна делать трюк, когда вам просто нужно вызвать компилятор F # (генерация кода F # с использованием CodeDOM также возможна в теории, но у него есть некоторые ограничения). ** Котировки ** в F # в основном используются для выполнения кода, написанного в F # в некоторой другой среде исполнения (как SQL, как JavaScript на стороне клиента, как код графического процессора), поэтому они не очень полезны, когда у вас есть какая-то программа как строка. –

Смежные вопросы