Разбор текстовой строки в F # -код - PullRequest
11 голосов
/ 30 марта 2012

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

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

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

Ответы [ 3 ]

11 голосов
/ 02 апреля 2012

Желаемого можно достичь с помощью 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's 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. Наслаждайтесь!

4 голосов
/ 30 марта 2012

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

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

0 голосов
/ 30 марта 2012

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...