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

13

我想做类似于这样的事情:

let x = 5
let y = 10

let expr = Console.ReadLine()

expr

在控制台中,如果要将 "x+y" 存储在表达式中,应该在哪里输入?

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

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

感谢您提供的任何帮助!

Adam

5个回答

5

我刚看到Joh在他的F#游戏开发页面上使用引号评估。

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

如果您只需要进行简单的数学计算,可以从Edmonodo的CodePlex页面下载他的表达式解析器和求值器 - C#/F#中的符号微分

祝好运- Jiří


2

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

编辑:

作为快速跟进,我知道在ocaml中,您可以使用ocamlmktop将交互式控制台暴露给用户。我不确定F#中是否有相当的功能。尽管如此,这似乎与您想要的Web界面不符(正确吗?)。


1
你知道有没有人为这个目的定义了F#的语法?看起来很有用,而且不应该由每个需要它的人重新发明。 - Adam Barney
1
@Adam:微软故意关闭了使这种可能性成为现实的接口,特别是为了防止人们使用这种技术来创建与Visual Studio竞争的产品。 - J D

1

这方面没有现成的解决方案。

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

尽管它看起来主要是为扩展LINQ查询而设计的,但它也作为一个好的解析器。我们对它进行了一些修改,以支持do/let绑定,以获得更多的灵活性。


0

或者您可以查看我的 F# 代码,它实现了数学表达式求值器。


0

F#没有像Lisp那样的eval函数(据我所知),如果你想知道的话。不过,你可以根据字符串输入自己构建一个表达式树。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接