F#相当于Eval

aka*_*nom 12 .net lisp f# eval

是否有与Eval等效的F#?我的目的是让我的应用程序从文件中加载一个小代码示例

let file = "c:\mysample"
let sample = loadFromFile file
let results = eval(sample)
Run Code Online (Sandbox Code Playgroud)

我是F#的新手,在将其应用到项目之前尝试找出一些限制.

谢谢

Tom*_*cek 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")
Run Code Online (Sandbox Code Playgroud)

将源文件编译为程序集后,您需要使用.NET Reflection加载程序集并从程序集中运行某些特定的函数或类(例如,您可以查找具有某些特殊名称或标记有某些属性的函数) ).

(作为旁注,如果您的源代码相对简单,可能会选择使用引文或编写您自己的解释器,如相关的SO问题中提到的那样,但如果您想支持F#的全部功能,则可能不是这样)

  • **CodeDOM**技术不是很优雅,但是当你需要调用F#编译器时它应该可以做到(使用CodeDOM生成F#代码在理论上也是可能的,但它有一些局限性).**F#中的引号**主要用于在某些不同的执行环境中执行用F#编写的代码(如SQL,客户端的JavaScript,GPU代码),所以当你有一些程序时它们并不是真的有用作为一个字符串. (2认同)