gpt4 book ai didi

f# - 如何在已编译的 F# 程序中执行在字符串中找到的 F# 代码?

转载 作者:行者123 更新时间:2023-12-03 20:07:54 27 4
gpt4 key购买 nike

如何从已编译的 F# 程序中的字符串执行 F# 代码?

最佳答案

这是一个小脚本,它使用 FSharp CodeDom 将字符串编译为程序集,并将其动态加载到脚本 session 中。

它使用类型扩展只是为了允许在参数上使用有用的默认值(希望让绑定(bind)函数在不久的将来支持可选、命名和参数参数。)

#r "FSharp.Compiler.dll"
#r "FSharp.Compiler.CodeDom.dll"

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

let CompileFSharpString(str, assemblies, output) =
use pro = new FSharpCodeProvider()
let opt = CompilerParameters(assemblies, output)
let res = pro.CompileAssemblyFromSource( opt, [|str|] )
if res.Errors.Count = 0 then
Some(FileInfo(res.PathToAssembly))
else None

let (++) v1 v2 = Path.Combine(v1, v2)
let defaultAsms = [|"System.dll"; "FSharp.Core.dll"; "FSharp.Powerpack.dll"|]
let randomFile() = __SOURCE_DIRECTORY__ ++ Path.GetRandomFileName() + ".dll"

type System.CodeDom.Compiler.CodeCompiler with
static member CompileFSharpString (str, ?assemblies, ?output) =
let assemblies = defaultArg assemblies defaultAsms
let output = defaultArg output (randomFile())
CompileFSharpString(str, assemblies, output)

// Our set of library functions.
let library = "

module Temp.Main
let f(x,y) = sin x + cos y
"
// Create the assembly
let fileinfo = CodeCompiler.CompileFSharpString(library)

// Import metadata into the FSharp typechecker
#r "0lb3lphm.del.dll"

let a = Temp.Main.f(0.5 * Math.PI, 0.0) // val a : float = 2.0

// Purely reflective invocation of the function.
let asm = Reflection.Assembly.LoadFrom(fileinfo.Value.FullName)
let mth = asm.GetType("Temp.Main").GetMethod("f")

// Wrap weakly typed function with strong typing.
let f(x,y) = mth.Invoke(null, [|box (x:float); box (y:float)|]) :?> float

let b = f (0.5 * Math.PI, 0.0) // val b : float = 2.0

要在编译的程序中使用它,您需要纯粹的反射调用。

当然,与我们社区中的许多人迫切要求的完整脚本 API 相比,这只是一个玩具。

祝你好运,

丹尼

关于f# - 如何在已编译的 F# 程序中执行在字符串中找到的 F# 代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1156665/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com