f# - 是否可以使用 F# 模式匹配作为另一种语言或 DSL 的求解器/库?

标签 f# pattern-matching interpreter abstract-syntax-tree

我正在构建一种玩具语言,我想要进行模式匹配。我可以自己构建整个东西(但不知道如何构建),但因为我将在 F# 中完成,所以我想知道我是否可以将整个事情推迟给它。

所以,我有一个解释器和我的自定义语法。如果我给出一个 AST,是否可以使用 F# 用它来解决模式匹配?

另一种看待这个问题的方法,是否可以使用来自 C# 和其他 .NET 语言的 F# 模式匹配?

例如,如果程序是(在几乎像 F# 的发明语法中):

case x with 
    ( 1 , 2 , Three):
        print("Found 1, 2, or 3!")
    else var1:
        print("%d" % var1)

可以做到

matched, error = F#MagicHere.Match(EvaluateMyAST)

最佳答案

我不确定我是否正确理解了你的问题,但我怀疑你可以使用 F# Compiler Service做你需要做的事。基本上,编译器服务允许您调用编译器执行的一些任务(它是一个普通的 .NET 库)。

第一步是将您的 AST 转换为有效的 F# 代码 - 我想您可以找到一种系统的方法来执行此操作(但这需要一些思考)。然后您可以使用 F.C.S 来:

  • 对表达式进行类型检查,这会在出现重叠情况和遗漏情况时向您发出警告(例如,当您的模式匹配不完整时)。

  • 它为您提供了模式匹配的 AST,我相信您甚至可以获得可以解释以评估模式匹配的决策树。

  • 或者,您可以使用 F.C.S 编译代码并运行它(前提是您可以将 DSL 转换为 F# 代码)

关于f# - 是否可以使用 F# 模式匹配作为另一种语言或 DSL 的求解器/库?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27241285/

相关文章:

variables - 定义和使用全局变量的最简单方法

java - 检查字符串后面是否有字符串

scala在线代码执行

f# - 为什么 F# 中的 Option 类型有一个 Value 属性?

f# - 如何从 F# 调用 Q# 操作

java - 如何使用java中的模式匹配器找到精确单词的匹配

string - 为什么我不能像在 trim_right_matches() 中那样在 trim_matches() 中使用 &str?

python - Python 项目的调试和发布构建策略

haskell - 设计一种简单的静态类型化语言的类型系统(在Haskell中)

f# - 有约束的泛型