F#编译器服务错误地解析程序

费奥多·索金(Fyodor Soikin)

更新:

我现在意识到这个问题很愚蠢,我应该已经提了这个问题。事后看来,我什至不明白为什么我甚至问了这个问题。
问题在这里: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

问题是:这是我应该报告的合法错误,还是我遗漏了某些东西?


一些注意事项

  1. 这是一个包含最少repro的回购(我不想在此问题中包括它,因为Compiler Services需要相当多的跳舞)。
  2. 在该let h之后添加更多语句不会更改结果。
  3. 当编译为IL时(相对于Compiler Services进行了解析),它似乎按预期工作(例如,参见fiddle
  4. 如果我输入g一个值,程序将正确解析。
  5. 如果我执行g正常功能(而不是部分应用),则程序将正确解析。
托马斯·麦琴斯基(TomaszMaczyński)

我没有先验的经验,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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

C编译器错误或程序错误?

来自分类Dev

处理2个将C#转换为F#的编译器错误

来自分类Dev

为什么在F#中不将隐式参数视为编译器错误

来自分类Dev

创建辅助非通用构造函数时F#中的编译器错误

来自分类Dev

处理2个将C#转换为F#的编译器错误

来自分类Dev

如何使F#编译器(fsc)变得冗长?

来自分类Dev

令人困惑的F#编译器消息

来自分类Dev

解析编译器语法和错误的错误恢复

来自分类Dev

不清楚类型错误;ide在F#中知道类型,而编译器不知道

来自分类Dev

F#到JavaScript编译器的F#项目模板

来自分类Dev

从std :: vector继承,编译器错误?(最烦人的解析)

来自分类Dev

C和DLC编译器的奇怪解析错误

来自分类Dev

C和DLC编译器的奇怪解析错误

来自分类Dev

Java 编译器错误,无法解析 R,构建失败

来自分类Dev

F#错误编译

来自分类Dev

C ++程序编译器错误:无匹配功能

来自分类Dev

Java程序继续运行,没有编译器错误

来自分类Dev

添加时间程序编译器错误:找不到符号

来自分类Dev

在Linux服务器上编译C ++程序时Intel编译器的语法

来自分类Dev

隐含编译器错误?

来自分类Dev

Swift编译器错误

来自分类Dev

奇怪的编译器错误

来自分类Dev

很多编译器错误

来自分类Dev

奇怪的编译器错误

来自分类Dev

奇怪的编译器错误

来自分类Dev

Maven编译器错误

来自分类Dev

编译器中的错误?

来自分类Dev

Prisma 编译器错误

来自分类Dev

F#交互式-当多个文件引用同一程序集时,如何使用预编译器指令?