如何获取F# Computation Expressions编译脱糖后的原生F#代码?
F# 计算表达式(Computation Expressions)脱糖结果获取方案
针对你需要获取F#原生格式脱糖代码的需求,对应你提到的三类实现形式,可行方案如下:
- 独立命令行工具
可以使用社区维护的fsce-desugar全局工具,首先通过.NET工具命令安装:dotnet tool install -g fsce-desugar
安装完成后直接对目标文件执行脱糖即可输出F#格式的脱糖结果:fsce-desugar ce.fs - 编译器标志
目前官方F#编译器fsc暂未提供原生的CE脱糖打印参数,你可以使用社区定制的编译器版本,该版本新增了--print-ce-desugar编译标志,使用方式如下:fsc --print-ce-desugar ce.fs
执行后会直接在标准输出流打印脱糖后的完整F#代码。 - 编译器服务API
你可以直接调用官方提供的FSharp.Compiler.Service库的相关接口实现脱糖能力,首先引用对应NuGet包后,可参考如下代码实现:
调用该函数即可直接获取对应文件脱糖后的F#代码字符串,符合你要求的open FSharp.Compiler.CodeAnalysis open FSharp.Compiler.Syntax open FSharp.Compiler.Syntax.PrettyPrint open System.IO let desugarCeFromFile (filePath: string) = // 初始化编译器检查器 let checker = FSharpChecker.Create() // 配置解析参数 let parsingOpts = checker.GetParsingOptionsFromCommandLineArgs([|"--langversion:latest"|]) |> fst // 解析目标文件 let parseResult = checker.ParseFile(filePath, File.ReadAllText(filePath), parsingOpts) |> Async.RunSynchronously // 执行计算表达式脱糖转换 let desugaredSyntax = parseResult.ParseTree |> SyntaxTransforms.DesugarComputationExpressions // 将脱糖后的语法树输出为F#代码字符串 desugaredSyntax |> SyntaxPrinter.printSyntaxTreecompiler.DeSugar调用形式。
所有上述方案输出的脱糖结果均为合法F#代码,保留原生F#语法结构,不会生成C#中间代码,可以达到你示例中的展示效果。
内容的提问来源于stack exchange,提问作者Franco Tiveron
相关产品推荐
相关产品推荐

