如何评估在F#中存储为字符串的表达式

时间:2008-12-16 17:32:53

标签: .net f#

我想做一些像这样的事情:

let x = 5
let y = 10

let expr = Console.ReadLine()

expr

可以在控制台中键入"x+y"以存储在expr中。

如何在F#中评估这样的语句?

最终,我希望用户能够在网页上输入表达式或系统规则,并将它们保存在数据库中,以便在适当的时间在F#库中应用。我只是不知道如何将输入的字符串转换为F#中的函数值。

感谢您提供的任何帮助!

亚当

5 个答案:

答案 0 :(得分:4)

我刚看到约翰使用他的报价评估 F# for game development page

      open Microsoft.FSharp.Linq.QuotationEvaluation
      ...
      let mk_gravity scale_func (up: 'Vec): 'Vec =
      let q = <@ let (*) = %scale_func in -9.81 * up @>
      q.Eval()

或者,如果您正在进行简单的数学评估,您可以从他的Codeplex plage下载Edmonodo的Expression解析器和评估器 - Symbolic Differentiation in C#/F#

祝你好运 - Jiří

答案 1 :(得分:2)

如上所述,F#没有eval,但是如果你可以定义语法,你可以利用F#中的Lex和Yacc实现(fslex和fsyacc)。

编辑:

作为快速跟进,我知道您可以通过ocamlmktop将交互式控制台用于您的用户。我不确定F#中的等价物。但是,这似乎与您想要的Web界面不匹配(正确吗?)。

答案 2 :(得分:0)

F#没有像Lisp(AFAIK)这样的评估函数,如果那是你想知道的。您可以根据字符串输入自己构建表达式树。

答案 3 :(得分:0)

没有任何开箱即用的东西。

我不确定您的需求是什么,但您可能会考虑动态LINQ示例。它有一个小的解析器来生成表达式树,然后您可以编译或操作它们。 ScottGu谈到它here

虽然它看起来主要用于扩展LINQ查询,但它充当了一个很好的解析器。我们将其破解为支持do / let绑定以获得更大的灵活性。

答案 4 :(得分:0)

或者您可以查看实现数学表达式求值程序的my F# code