【问题标题】:How can evaluate an expression stored as a string in F#如何评估在 F# 中存储为字符串的表达式
【发布时间】:2010-09-27 04:30:27
【问题描述】:

我想做这样的事情:

let x = 5
let y = 10

let expr = Console.ReadLine()

expr

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

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

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

感谢您提供的任何帮助!

亚当

【问题讨论】:

    标签: .net f#


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

      编辑:

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

      【讨论】:

      • 你知道是否有人为此定义了 F# 的语法吗?似乎是一个有用的东西,而不是每个需要它的人都应该重新发明的东西。
      • @Adam:微软故意关闭了使这成为可能的接口,特别是为了防止人们使用这种技术来创建 Visual Studio 的竞争对手。
      【解决方案3】:

      我刚刚看到 Joh 在他的 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 的表达式解析器和评估器 - Symbolic Differentiation in C#/F#

      祝你好运 - 吉日

      【讨论】:

        【解决方案4】:

        没有什么开箱即用的。

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

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

        【讨论】:

          【解决方案5】:

          或者你可以查看my F# code,它实现了数学表达式求值器。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2016-04-24
            • 2010-12-25
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多