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

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

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

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

Спасибо


person akaphenom    schedule 09.04.2010    source источник
comment
возможный дубликат stackoverflow.com/questions/372043/   -  person Brian    schedule 09.04.2010
comment
Вы хотите загрузить код F# из этого файла?   -  person phimuemue    schedule 09.04.2010
comment
Я думаю, что этот пост задает немного другой вопрос (хотя технически связанный). Один, упомянутый Брайаном, спрашивает о простых выражениях, а этот спрашивает о компиляции/оценке файла. Технически это может быть то же самое, но, вероятно, это совсем другой вариант использования.   -  person Tomas Petricek    schedule 09.04.2010


Ответы (1)


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

person Tomas Petricek    schedule 09.04.2010
comment
Я все еще пытаюсь разобраться в цитатах и ​​метапрограммировании в целом. Я почти уверен, что эта функциональность мне не понадобится, но я думал о том, чтобы предоставить некоторые тестовые примеры через наборы данных в отдельных файлах, которые я мог бы загружать динамически. CodeDom (тьфу - помните, как выщипывал эту свинью в 2004-м на С#) определенно добьется цели. Благодарю за ваш ответ. - person akaphenom; 09.04.2010
comment
CodeDOM — не очень элегантная технология, но она должна помочь, когда вам просто нужно вызвать компилятор F# (создание кода F# с помощью CodeDOM также возможно теоретически, но оно имеет некоторые ограничения). Цитаты в F# в основном используются для выполнения кода, написанного на F#, в какой-либо другой среде выполнения (как SQL, как JavaScript на стороне клиента, как код графического процессора), поэтому они не очень полезны, когда вы иметь некоторую программу в виде строки. - person Tomas Petricek; 09.04.2010