序列表达式构建器的源代码在哪里

Sno*_*rex 4 f#

我很好奇F#Seq计算表达式如何实现IEnumerable数据结构.

在GitHub上搜索Sharp.Core/seq.fs以实现yield!(YieldFrom(expr))不成功.

Tom*_*cek 6

正如Daniel引用的规范所说,序列表达式不被视为普通的计算表达式 - 而不是将它们转换为构建器方法调用(例如seq.For,seq.Yield等等),编译器实际上生成了特定于序列的代码.这主要是出于性能原因 - 对计算构建器的调用会增加太多开销.

以下是两个相关的指示:

  • GeneratedSequenceBase类型是编译序列表达时使用由编译器的基类-也有它周围其他库代码所使用的所生成的编译代码.请在此处查看F#库源代码.

  • TcSequenceExpression类型检查器中的方法是进行类型检查的地方.您可以看到编译器遵循的路径与普通计算表达式不同.这是在编译器源代码中.

  • 其他相关部分是ilxgen.fs编译器在类型检查后实际生成代码的位置 - 您可以通过GeneratedSequenceBase在源代码中查找来找到这些位置(但我不是这方面的专家)