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
Run Code Online (Sandbox Code Playgroud)
当我将块粘贴到FSI中时出现FS0010错误.但如果我没有缩进行#r,没有FS0010错误.我只是惊讶于预处理器行会对缩进敏感.这是一个编译器问题还是还有其他工作在这里?
我认为规范和文档在这个主题上相当不清楚,但规范在词法预处理器指令和编译器指令之间做出了显着的区别(请参阅\xc2\xa712.4):
\n\n\n编译器指令是非嵌套模块或命名空间声明组中的声明,格式如下:
\nRun Code Online (Sandbox Code Playgroud)\n# id string ... string\n词法预处理器指令
\n#if、#else和#endif与#indent "off"编译器指令类似。有关#if、#else、的详细信息#endif,请参见\xc2\xa73.3。该#indent "off"指令在 \xc2\xa718.4 中描述。
我的解释是,词法预处理器指令实际上是在运行主编译之前由某些预处理器处理的,因此缩进对于这些指令来说并不重要。
\n另一方面,诸如 、 等指令稍后#r由编译器处理,因此它们需要匹配通常的 F# 缩进准则。#load#time
正如@unwind所说,文档指出“缩进对于预处理器指令并不重要”,但我认为这仅适用于该文档页面上列出的预处理器指令(它们是词法预处理器指令,而不是编译器指令)。
\n