FSI版本:11.0.50727.1
所以我正在研究一个F#shell脚本,我遇到了一些让我感到惊讶的事情。
当我这样做时:
#if INTERACTIVE
#r "System.Data.dll"
#r "FSharp.Data.TypeProviders.dll"
#r "System.Data.Linq.dll"
#endif
open System
当我将块粘贴到FSI中时出现FS0010错误。但如果我没有缩进#r
行,则没有FS0010错误。我只是惊讶于预处理器行会对缩进敏感。这是一个编译器问题还是还有其他工作在这里?
答案 0 :(得分:4)
我认为规范和文档在这个主题上还不太清楚,但是规范在词汇预处理程序指令和编译器指令之间做了显着的区分(参见§12.4 }):
编译器指令是非嵌套模块或命名空间声明组中的声明,格式如下:
# id string ... string
词法预处理程序指令
#if
,#else
,#endif
和#indent "off"
与编译器指令类似。有关#if
,#else
,#endif
的详细信息,请参阅§3.3。#indent "off"
指令在§18.4中描述。
我的解释是词法预处理程序指令实际上是在运行主编译之前由某些预处理程序处理的,因此缩进对于这些并不重要。
另一方面,编译器稍后处理诸如#r
,#load
,#time
等指令,因此它们需要与通常的F#缩进指南相匹配。
正如@unwind所说,documentation状态“缩进对预处理程序指令并不重要”,但我认为这仅适用于该文档页面上列出的预处理程序指令(词汇预处理程序指令< / em>而不是编译器指令)。
答案 1 :(得分:2)
根据the documentation,它必须是其他工作:
缩进对预处理程序指令并不重要。