Разбор текстовой строки для F # -кода

Как взять текстовую строку, которая должна быть F # -кодом, и проанализировать ее на F # -код, чтобы распечатать результаты на экране?

Я предполагаю, что это будет разрешено с помощью функции .NET, поэтому это можно сделать через F # или С#.

Каким образом это, вероятно, разрешено на tryfsharp.org?

Ответ 1

Желаемый может быть достигнут с помощью F # CodeDom поставщика. Ниже приведенный минимальный отрывочный фрагмент демонстрирует требуемые шаги. Он принимает произвольный предположительно правильный код F # из строки и пытается скомпилировать его в файл сборки. В случае успеха он загружает эту только что синтезированную сборку из файла dll и вызывает от нее известную функцию, в противном случае она показывает, в чем проблема с компиляцией кода.

open System 
open System.CodeDom.Compiler 
open Microsoft.FSharp.Compiler.CodeDom 

// Our (very simple) code string consisting of just one function: unit -> string 
let codeString =
    "module Synthetic.Code\n    let syntheticFunction() = \"I've been compiled on the fly!\""

// Assembly path to keep compiled code
let synthAssemblyPath = "synthetic.dll"

let CompileFSharpCode(codeString, synthAssemblyPath) =
        use provider = new FSharpCodeProvider() 
        let options = CompilerParameters([||], synthAssemblyPath) 
        let result = provider.CompileAssemblyFromSource( options, [|codeString|] ) 
        // If we missed anything, let compiler show us what the problem
        if result.Errors.Count <> 0 then  
            for i = 0 to result.Errors.Count - 1 do
                printfn "%A" (result.Errors.Item(i).ErrorText)
        result.Errors.Count = 0

if CompileFSharpCode(codeString, synthAssemblyPath) then
    let synthAssembly = Reflection.Assembly.LoadFrom(synthAssemblyPath) 
    let synthMethod  = synthAssembly.GetType("Synthetic.Code").GetMethod("syntheticFunction") 
    printfn "Success: %A" (synthMethod.Invoke(null, null))
else
    failwith "Compilation failed"

При запуске он выдает ожидаемый результат

Success: "I've been compiled on the fly!"

Если вы собираетесь сыграть с фрагментом, для этого требуется ссылка FSharp.Compiler.dll и FSharp.Compiler.CodeDom.dll. Наслаждайтесь!

Ответ 2

Я предполагаю, что это будет разрешено с помощью функции .NET, поэтому это можно сделать через F # или С#.

Неа. F # обеспечивает сравнительно ручные средства метапрограммирования. Вам нужно будет вырвать соответствующий код из компилятора F #.

Ответ 3

F # имеет интерпретатор fsi.exe, который может сделать то, что вы хотите. Я думаю, что у него также есть API.