我正在构建一种玩具语言,我想要进行模式匹配。我可以自己构建整个东西(但不知道如何构建),但因为我将在 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/