我现在意识到这个问题很愚蠢,我应该已经提了这个问题。事后看来,我什至不明白为什么我甚至问了这个问题。
问题在这里:https : //github.com/fsharp/FSharp.Compiler.Service/issues/544
我正在使用FSharp编译器服务来解析一些F#代码。
我现在面临的特定代码是:
let f x y = x+y
let g = f 1
let h = (g 2) + 3
该程序将产生TAST,而无需(+)
在最后一行进行调用。也就是说,编译器服务会返回TAST,就像最后一行是just一样let h = g 2
。
问题是:这是我应该报告的合法错误,还是我遗漏了某些东西?
我没有先验的经验,FSharp.Compiler.Services
但是尽管如此,我还是使用Visual Studio的调试器进行了一次小型调查。我分析了以下字符串的抽象语法树:
"""
module X
let f x y = x+y
let g = f 1
let h = (g 2) + 3
"""
我发现里面有以下对象:
App (Val (op_Addition,NormalValUse,D:\file.fs (6,32--6,33) IsSynthetic=false),TType_forall ([T1; T2; T3],TType_fun (TType_var T1,TType_fun (...,...))),...,...,...)
如您所见,在第32行和第32行之间添加了第六行。
F#Interactive无法正确显示它的最可能解释是库中的错误(也许AST处于不一致状态或漂亮的打印损坏了)。我认为您应该在项目的问题跟踪器中提交错误。
更新:
可以通过以下方法在调试器中获取上述对象:
error.[0]
(option of Microsoft.FSharp.Compiler.SourceCodeServices.FSharpImplementationFileDeclaration.Entity)
.Item2
.[2]
(option of Microsoft.FSharp.Compiler.SourceCodeServices.FSharpImplementationFileDeclaration.MemberOrFunctionOrValue)
.Item3
.f (private member)
.Value
(option of Microsoft.FSharp.Compiler.SourceCodeServices.FSharpExprConvert.ConvExprOnDemand@903)
.expr
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句