F#编译器服务错误地解析程序 更新:
我现在意识到这个问题很愚蠢,我应该把这个问题归档。事后看来,我不明白为什么我会问这个问题。F#编译器服务错误地解析程序 更新:,f#,f#-compiler-services,F#,F# Compiler Services,我现在意识到这个问题很愚蠢,我应该把这个问题归档。事后看来,我不明白为什么我会问这个问题。 问题在于: 原始问题: 我正在使用FSharp编译器服务解析一些F#代码。 我现在面临的特殊代码是: let f x y = x+y let g = f 1 let h = (g 2) + 3 此程序生成一个TAST,最后一行没有(+)调用。也就是说,编译器服务返回TAST,就好像最后一行是let h=g2 问题是:这是一个我应该报告的合法错误,还是我遗漏了什么 一些注释 包含最少的re
问题在于:
原始问题: 我正在使用FSharp编译器服务解析一些F#代码。
我现在面临的特殊代码是:
let f x y = x+y
let g = f 1
let h = (g 2) + 3
此程序生成一个TAST,最后一行没有(+)
调用。也就是说,编译器服务返回TAST,就好像最后一行是let h=g2
问题是:这是一个我应该报告的合法错误,还是我遗漏了什么
一些注释
之后,让h
行不改变结果我没有使用
FSharp.Compiler.Services
的先验经验,但我还是使用VisualStudio的调试器做了一个小调查。我分析了以下字符串的抽象语法树:
"""
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 (...,...))),...,...,...)
如您所见,在第6行中,在字符32和33之间增加了一个字符
F#Interactive无法正确显示的最可能的解释是库中的一个bug(可能AST处于不一致状态,或者漂亮的打印被破坏)。我认为你应该把一个bug归档
更新:
上述对象可通过以下方式在解块器中获得:
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