我很好奇F#Seq计算表达式如何实现IEnumerable数据结构.
在GitHub上搜索Sharp.Core/seq.fs以实现yield!(YieldFrom(expr))不成功.
正如Daniel引用的规范所说,序列表达式不被视为普通的计算表达式 - 而不是将它们转换为构建器方法调用(例如seq.For,seq.Yield等等),编译器实际上生成了特定于序列的代码.这主要是出于性能原因 - 对计算构建器的调用会增加太多开销.
以下是两个相关的指示:
的GeneratedSequenceBase类型是编译序列表达时使用由编译器的基类-也有它周围其他库代码所使用的所生成的编译代码.请在此处查看F#库源代码.
TcSequenceExpression类型检查器中的方法是进行类型检查的地方.您可以看到编译器遵循的路径与普通计算表达式不同.这是在编译器源代码中.
其他相关部分是ilxgen.fs编译器在类型检查后实际生成代码的位置 - 您可以通过GeneratedSequenceBase在源代码中查找来找到这些位置(但我不是这方面的专家)
| 归档时间: |
|
| 查看次数: |
344 次 |
| 最近记录: |